2008-08-28 13 views
48

से इस क्वेरी महान काम करता है:बनाना एक LINQ चयन एकाधिक तालिकाओं

var pageObject = (from op in db.ObjectPermissions 
        join pg in db.Pages on op.ObjectPermissionName equals page.PageName 
        where pg.PageID == page.PageID 
        select op) 
       .SingleOrDefault(); 

मैं अपने 'सेशन' फ़ील्ड के साथ एक नए प्रकार मिलता है। अब मैं अपने 'पीजी' फ़ील्ड को भी पुनर्प्राप्त करना चाहता हूं, लेकिन

select op, pg).SingleOrDefault(); 

काम नहीं करता है।

मैं दोनों तालिकाओं से सब कुछ कैसे चुन सकते हैं, ताकि वे अपने नए pageObject प्रकार में दिखाई देते हैं?

उत्तर

79

को आप इस के लिए अनाम प्रकार का उपयोग कर सकते हैं, यानी:

var pageObject = (from op in db.ObjectPermissions 
        join pg in db.Pages on op.ObjectPermissionName equals page.PageName 
        where pg.PageID == page.PageID 
        select new { pg, op }).SingleOrDefault(); 

ऐसा अनाम प्रकार इसलिए की एक IEnumerable में pageObject कर देगा AFAIK आप इसे अन्य तरीकों से पास नहीं कर पाएंगे, हालांकि यदि आप विधि में खेलने के लिए डेटा प्राप्त कर रहे हैं आप वर्तमान में यह पूरी तरह से ठीक है। आप भी अपनी गुमनाम प्रकार, अर्थात् में गुण नाम कर सकते हैं: -

var pageObject = (from op in db.ObjectPermissions 
        join pg in db.Pages on op.ObjectPermissionName equals page.PageName 
        where pg.PageID == page.PageID 
        select new 
        { 
         PermissionName = pg, 
         ObjectPermission = op 
        }).SingleOrDefault(); 

यह नहीं कहा जा सकेंगे: -

if (pageObject.PermissionName.FooBar == "golden goose") Application.Exit(); 

उदाहरण के लिए :-)

2

आप एक नई अज्ञात प्रकार बनाना चाहिए:

select new { op, pg } 

आधिकारिक guide का संदर्भ लें।

1

परिवर्तन

select op) 

select new { op, pg }) 
6

आप नहीं चाहते हैं अज्ञात प्रकारों का उपयोग करने के लिए बी/सी मान लें कि आप किसी अन्य विधि को ऑब्जेक्ट पास कर रहे हैं, आप लोड डेटा लोड लोड विकल्प का उपयोग संबंधित डेटा लोड करने के लिए कर सकते हैं। यह आवश्यक है कि आपकी तालिकाएं विदेशी कुंजी के माध्यम से या आपके लिंक-टू-एसक्यूएल डीबीएमएल मॉडल में हों।

db.DeferredLoadingEnabled = false; 
DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<ObjectPermissions>(op => op.Pages) 
db.LoadOptions = dlo; 

var pageObject = from op in db.ObjectPermissions 
     select op; 

// no join needed 

तो फिर तुम फोन कर सकते हैं

pageObject.Pages.PageID 

अपने डेटा कैसा दिखता है पर निर्भर करता है, तो आप शायद के आसपास इस दूसरे रास्ते क्या करना चाहते हैं,

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Pages>(p => p.ObjectPermissions) 
db.LoadOptions = dlo; 

var pageObject = from p in db.Pages 
       select p; 

// no join needed 

var objectPermissionName = pageObject.ObjectPermissions.ObjectPermissionName; 
2

तो गुमनाम प्रकार

public class PermissionsAndPages 
{ 
    public ObjectPermissions Permissions {get;set} 
    public Pages Pages {get;set} 
} 
: आप के लिए मुसीबत का कारण बनता है, तो आप एक सरल डेटा वर्ग बना सकते हैं

और उसके बाद अपनी क्वेरी में

select new PermissionsAndPages { Permissions = op, Page = pg }; 

तो फिर तुम इस के आसपास पारित कर सकते हैं:

return queryResult.SingleOrDefault(); // as PermissionsAndPages 
संबंधित मुद्दे