2011-07-20 20 views
24

के लिए शामिल() के साथ कैसे काम करता है मेरे पास नीचे एक प्रश्न है, लेकिन मैं उत्सुक लोड गुणों को शामिल करने के लिए एक Include() करना चाहता हूं।LINQ अभिव्यक्ति वाक्यविन्यास उत्सुक लोडिंग

from a in Actions 
join u in Users on a.UserId equals u.UserId 
select a 

2) सबसे पहले प्रयास: क्रिया एक नेविगेशन संपत्ति, उपयोगकर्ता (Action.User)

1) मेरे मूल क्वेरी है

from a in Actions.Include("User") 
join u in Users on a.UserId equals u.UserId 
select a 

लेकिन Action.User नहीं आबादी वाले है ।

3) क्वेरी के बाहर कार्रवाई में नेविगेशन संपत्ति में उत्सुक लोड 'उपयोगकर्ता' करने के लिए प्रयास करें:

(from a in Actions 
join u in Users on a.UserId equals u.UserId  
select a).Include("User") 

LINQPad की कोशिश में के शामिल मैं एक त्रुटि मिलती है:

'System.Linq.IQueryable' 'Include' के लिए परिभाषा नहीं है और 'System.Linq.IQueryable' प्रकार के पहले तर्क को स्वीकार करने के लिए कोई एक्सटेंशन विधि 'शामिल' नहीं हो सकती है (एक उपयोग निर्देश या असेंबली संदर्भ जोड़ने के लिए F4 दबाएं)

मुझे लगता है ऐसा इसलिए है क्योंकि LINQ शामिल नहीं है() ।

तो मैंने वीएस में कोशिश की; क्वेरी 2 रन, लेकिन अप्रचलित उपयोगकर्ता संपत्ति देता है। प्रश्न 3 एक्सटेंशन विधि मौजूद नहीं प्रतीत होती है, हालांकि यह क्वेरी के बिना स्वयं कार्रवाई पर मौजूद है।

+0

एक्शन-मॉडल में "उपयोगकर्ता" नामक एक संपत्ति है? क्या आपके पास डीबीकॉन्टेक्स्ट है? – dknaack

उत्तर

50

से मैं इसे वैसे भी पता लगा, सुझाव के लिए धन्यवाद।

var qry = (from a in Actions 
join u in Users on a.UserId equals u.UserId  
select a).Include("User") 

कारण IntelliSense नहीं दिखाया जा सका शामिल के बाद क्वेरी क्योंकि मैं निम्नलिखित का उपयोग कर की जरूरत थी:

using System.Data.Entity; 

सब कुछ काम किया समाधान इस (मेरे सवाल में 2 प्रयास) करना है ठीक है यह कर रहा हूँ।

+0

सुपर सहायक, धन्यवाद! –

+2

जोड़ना स्वचालित रूप से होगा, मान लें कि आपकी इकाई संदर्भ में सही ढंग से मैप की गई है। आप इसे एक सरल क्वेरी के साथ प्राप्त कर सकते हैं: 'var qry = क्रियाओं में से। शामिल करें ("उपयोगकर्ता") एक' चुनें 'यदि आप उन संस्थाओं में शामिल हो रहे हैं जिन्हें नेविगेशन गुणों के रूप में स्पष्ट रूप से मैप नहीं किया गया है (यानी: क्रिया में उपयोगकर्ता नहीं है संपत्ति, या किसी कारण के लिए नेविगेशन प्रॉपर्टी के रूप में मैप नहीं किया गया है), तो आपको शामिल होने की आवश्यकता होगी, शामिल करें को हटा दें, और फिर आप ईएफ को वापस करने के लिए 'नया {एक्शन = ए, यूजर = यू}' का उपयोग कर सकते हैं। डेटा में शामिल हो गए (बाद वाले को आमतौर पर प्रक्षेपण के रूप में जाना जाता है) – JoeBrockhaus

0

मैं इस LoadWith विकल्प

var dataOptions = new System.Data.Linq.DataLoadOptions(); 
dataOptions.LoadWith<Action>(ac => as.User); 
ctx.LoadOptions = dataOptions; 

यही इसके लिए इस्तेमाल करते हैं। सीटीएक्स आपका डेटाकॉन्टेक्स्ट है। यह मेरे लिए काम करता है :-)

+0

यह उदाहरण LINQ से SQL का उपयोग करता है जबकि सवाल इकाई फ्रेमवर्क के बारे में था। –

+0

आप सही हैं, मैंने ईएफ टैग को याद किया है: -/ – Mariusz

14

क्या आप चाहते हैं एक प्रश्न है कि सभी Action संस्थाओं जिसका जुड़े User इकाई वास्तव में Action.UserIdforeign key property के माध्यम से मौजूद है वापस आ जाएगी है, तो यह यह करना होगा:

var results = context.Actions 
    .Include("User") 
    .Where(action => 
     context.Users.Any(user => 
      user.UserId == action.UserId)); 

हालांकि आप फ़िल्टरिंग फ़िल्टर करने के लिए विदेशी कुंजी गुणों का उपयोग करने की आवश्यकता नहीं है, क्योंकि आपके पास navigation properties भी है। तो आपकी क्वेरी इस उदाहरण की तरह बजाय Action.User नेविगेशन संपत्ति पर छानने, द्वारा सरल किया जा सकता:

var results = context.Actions 
    .Include("User") 
    .Where(action => action.User != null); 

अपने मॉडल कहा गया है कि Action.User संपत्ति कभी नहीं अशक्त हो सकता है (उदाAction.UserId विदेशी कुंजी डेटाबेस में नल) नहीं है और क्या आप चाहते हैं के साथ उनके संबद्ध Users, तो क्वेरी और भी आसान

var results = context.Actions.Include("User"); 
+0

हाय, आपके उदाहरण सभी जंजीर विधियों को दिखाते हैं, मेरी क्वेरी अभिव्यक्ति वाक्यविन्यास में है जैसा कि मैंने ऊपर दिखाया है (से/चयन करके)। क्या आप मुझे दिखा सकते हैं कि यह कैसे करें? – jaffa

2

बुनियादी क्वेरी आपके द्वारा प्रेषित प्रश्न आप जीता 'में उल्लेख करने से हो जाता है वास्तव में सभी Action संस्थाओं है

from a in Actions 
join u in Users on a.UserId equals u.UserId 
select new 
{ 
    actionUserId = a.UserId 
    . 
    . 
    . 
    userProperty1 = u.UserId 
}; 

हालांकि ObjectContext पर विधि शामिल करें उपयोग करने के लिए आप इस्तेमाल कर सकते हैं निम्नलिखित:

जब तक आप निम्नलिखित के रूप में एक गुमनाम प्रकार वापसी टी उपभोक्ता के गुण देखने में सक्षम हो

सुनिश्चित करें कि आप निम्न पंक्ति का उपयोग करके बंद LazyLoading है बनाओ:

entities.ContextOptions.LazyLoadingEnabled = false; 

फिर आगे बढ़ना

var bar = entities.Actions.Include("User"); 
var foo = (from a in bar 
      select a); 
+0

मेरी समझ से, 'शामिल करें ("उपयोगकर्ता")' उत्सुक लोडिंग को ट्रिगर करने के लिए है, इसलिए 'LazyLoadingEnabled = false' के साथ आलसी लोडिंग को बंद करने के लिए सबसे अच्छा अनावश्यक है लेकिन अंत में गुमराह है। मुझे लगता है कि अगर आप अपने 'foo' और 'bar' को स्वैप करना चाहते हैं तो Include EF क्वेरी पर काम करेगा और अतिरिक्त तालिका को उत्सुक लोड करेगा। – Zorgarath

6

बेहतर, दोस्ताना कोड (EF6) refactor

using System.Data.Entity; 
[...] 
var x = (from cart in context.ShoppingCarts 
where table.id == 123 
select cart).Include(t => t.CartItems); 

या

var x = from cart in context.ShoppingCarts.Include(nameof(ShoppingCart.CartItems)) 
where table.id == 123 
select cart; 

अद्यतन 3/31/2017

तुम भी उपयोग कर सकते हैं लैम्ब्डा वाक्य रचना में शामिल किसी भी विधि के लिए:

var x = from cart in context.ShoppingCarts.Include(p => p.ShoppingCart.CartItems)) 
where table.id == 123 
select cart; 
+1

'nameof()' के लिए धन्यवाद। मैं टेबल नामों के हार्डकोडेड तारों को देखता रहता हूं। – Zorgarath

+1

सी # 6 में जोड़े गए सभी सुविधाओं में से, नाम एक ऐसा है जिसे मैंने किसी अन्य से अधिक उपयोग किया है! प्रतिक्रिया के लिए धन्यवाद! – K0D4

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