2011-08-08 17 views
14

में Concat() के साथ काम नहीं करता है VB.net और निम्न LINQ कथन का उपयोग करना। मुझे संदेह है कि "ऑर्डर बाय" Concat() के साथ काम नहीं करता है। मैं उपयोगकर्ता की वर्तमान वस्तु को सूचीबद्ध करना चाहता हूं और फिर अधिक उपलब्ध वस्तुओं को आरोही क्रम में सूचीबद्ध करना चाहता हूं। तो सबसे पहले मैं डीबी से वर्तमान आइटम का चयन करता हूं और फिर क्रम में अगले उपलब्ध आइटम का चयन करता हूं। LINQ कथन द्वारा ऑर्डर को अनदेखा कर रहा है और पीके द्वारा क्रमबद्ध किया गया है (जो itemID है) मैंने कथन निष्पादित करने के तुरंत बाद सूची की जांच की। जब मैं बयान तोड़ता हूं और उन्हें अलग से करता हूं तो वे भविष्यवाणी के रूप में काम करते हैं। कोई विचार, सुझाव या टिप्पणियां। धन्यवाद, PMऑर्डर द्वारा LINQ

(From items In myDatabase.ItemAssignments _ 
Where items.BuildingID = buildingID _ 
And items.ResidentID = ResidentID _ 
Select items).Concat(From moreitems In myDatabase.ItemAssignments _ 
         Where moreitems.occupied = 0 _ 
         And moreitems.BuildingID = buildingID _ 
         Order by moreitems.Floor, moreitems.ItemNumber _ 
         Select moreitems) 

उत्तर

14

Concat वास्तव में खंड द्वारा आदेश की अनदेखी जब यह एसक्यूएल को LINQ करने के लिए आता है। यदि आप LINQPad का उपयोग कर रहे हैं या DataContext.Log property सेट कर रहे हैं तो इसे जेनरेट किए गए SQL से सत्यापित किया जा सकता है।

इस से निपटने का एक तरीका आदेश के साथ मदद करने के लिए एक अज्ञात प्रकार के माध्यम से एक डमी मूल्य पेश करना है। मैंने स्पष्टता के लिए नीचे दिए गए प्रश्नों को विभाजित कर दिया है, हालांकि जब तक आपको आदेश निर्दिष्ट करने की आवश्यकता नहीं है तब तक क्वेरी सिंटैक्स का उपयोग करके वही दृष्टिकोण संभव है।

Dim firstQuery = From items In myDatabase.ItemAssignments _ 
       Where items.BuildingID = buildingID _ 
       And items.ResidentID = ResidentID _ 
       Select New With { .Row = items, .Order = 1 } 
Dim secondQuery = From moreitems In myDatabase.ItemAssignments _ 
        Where moreitems.occupied = 0 _ 
        And moreitems.BuildingID = buildingID _ 
        Select New With { .Row = moreitems, .Order = 2 } 

Dim query = firstQuery.Concat(secondQuery) _ 
         .OrderBy(Function(o) o.Order) _ 
         .ThenBy(Function(o) o.Row.Floor) _ 
         .ThenBy(Function(o) o.Row.ItemNumber) _ 
         .Select(Function(o) o.Row) 

एक और कम वांछनीय विकल्प प्रश्नों में से एक है, जो डेटाबेस से परिणाम खींच लेंगे पर AsEnumerable method कॉल करने के लिए है। शामिल वस्तुओं की संख्या के आधार पर और यदि आगे फ़िल्टरिंग की आवश्यकता है, तो इसका प्रदर्शन पर प्रतिकूल प्रभाव पड़ सकता है।

इस इस दृष्टिकोण का उपयोग करने के लिए आपकी मूल क्वेरी के पहले भाग को बदलने का उपयोग करें:

From items In myDatabase.ItemAssignments.AsEnumerable() ... 

आदेश अपने दूसरे भाग पर तो के रूप में इरादा और उत्पन्न एसक्यूएल के रूप में ज्यादा प्रतिबिंबित करेगा काम करेंगे।

संबंधित मुद्दे