2010-02-18 15 views
19

चार तालिकाओं के साथ काम कर रहा है।लिंक आदेश ऑर्डर नेविगेशन संपत्ति के साथ शून्य

उपयोगकर्ता -> एक उपयोगकर्ता आईडी और एक departmentid (int)
समूह सहित मूलभूत उपयोगकर्ता जानकारी है -> एक ग्रुप
GroupsMembers सहित बुनियादी समूह की जानकारी -> टेबल, एक समूह है और यह के सदस्यों के बीच संबंध है के लिए कई > बुनियादी विभाग की जानकारी deptid

सहित मैं विभागों तालिका में deparmtnet आईडी पर उन तालिका में departmentid से एक FK है - कई संबंध है, तो ग्रुप और उपयोगकर्ता आईडी कॉलम
विभागों कर रहे हैं। उन USERID से groupsmembers userid

को यह edmx में समूहों को एक उपयोगकर्ता नेविगेशन संपत्ति जो समूह के सभी सदस्यों होगा की अनुमति देता है

समूहों से

FK ग्रुप groupsmembers ग्रुप को FK।

var grp = grpSource.FirstOrDefault(g => g.GroupID == groupID) 
if (grp.GroupID > 0) 
{ 
    var userQuery = from u in grp.Users 
        where !u.Deleted 
        select u; 
    userQuery = userQuery.OrderBy(u => u.Department.Name); 
} 

मैं उपयोगकर्ता सहित हूं। डिपार्टमेंट।

समस्या आता है क्योंकि उपयोगकर्ताओं को एक विभाग की जरूरत नहीं है, इसलिए departmentid स्तंभ नल है। यदि ऐसे कोई उपयोगकर्ता हैं जिनके लिए डिपार्टमेंट नल है, ऑर्डरबी टूट जाती है और आपको बताती है। डिपार्टमेंट शून्य है। यदि कोई डिपार्टमेंट शून्य नहीं है, तो यह बहुत अच्छा काम करता है। मुझे विभाग के आधार पर सॉर्ट करने का एक तरीका चाहिए। अगर नल डिपार्टमेंट्स हैं तो भी। कोई सुझाव?

उत्तर

40

यदि विभाग रिक्त है की जाँच करने के सशर्त ऑपरेटर का उपयोग कर सकते हैं:

userQuery = userQuery.OrderBy(u => (u.Department != null) ? u.Department.Name : String.Empty); 

बेहतर स्पष्टता के लिए, मेरे द्वारा बनाए गए निम्न एक्सटेंशन विधि:

public static TResult IfNotNull<TSource, TResult>(this TSource obj, Func<TSource, TResult> selector, TResult defaultValue) 
    { 
     if (obj != null) 
      return selector(obj); 
     return defaultValue; 
    } 

यह इस प्रकार के रूप में इस्तेमाल किया जा सकता:

userQuery = userQuery.OrderBy(u => u.Department.IfNotNull(d => d.Name, String.Empty)); 
+0

एकदम सही है। मैं अपने आप को ऐसा सोच रहा था, लेकिन मुझे यकीन नहीं था कि तुलना रिकॉर्ड के आधार पर रिकॉर्ड पर की जाएगी :-) – Steph

0

कोलेसे ऑपरेटर का उपयोग करने के बारे में कैसे?

userQuery = userQuery.OrderBy(u => u.Department.Name ?? string.Empty); 
संबंधित मुद्दे