2008-08-28 27 views
48

arasından seçim oluşturma: bir LINQ Bu sorgu inşaat büyük birden fazla tablo

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(); 

benim 'op' alanları içeren yeni bir tür olsun. Şimdi 'pg' alanlarını da almak istiyorum, ancak

çalışmıyor.

Her iki tablonun da yeni sayfamda görünmesi için her şeyi nasıl seçebilirim?

cevap

79

için sen yani bunun için anonim türlerini kullanabilirsiniz Diğer yöntemlere aktarmayacaksınız, ancak eğer metotla oynamak için sadece veri alıyorsanız Şu an içinde gayet iyisin. Ayrıca anonim tipi, yani özelliklerini adlandırabilirsiniz: -

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(); 

Bu demek sağlayacak: -

2

Sen yeni bir anonim türü oluşturmalısınız:

select new { op, pg } 

resmi guide bakınız. 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 { pg, op }).SingleOrDefault(); 

Bu yüzden anonim bir türde bir IEnumerable PageObject yapacak:

1

değişiklik

select op) 

select new { op, pg }) 
6

sen istemiyorsan :-) Örneğin

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

Anonim türleri kullanmak için b/c nesneyi başka bir yönteme aktardığınızı varsayalım, ilişkili verileri yüklemek için LoadWith yükleme seçeneğini kullanabilirsiniz. Tablolarınızın yabancı anahtarlar veya Linq-to-SQL dbml modelinizde ilişkilendirilmesini gerektirir.

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 

Sonra

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

anonim tip varsa, muhtemelen çevresinde bu başka bir yol yapmak ister,

pageObject.Pages.PageID 

veri neye benzediğini bağlı çağırabilir Sizin için sorun çıkarır, basit bir veri sınıfı oluşturabilirsiniz:

ve sonra sorguda:

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

Sonra etrafında bu geçirebilirsiniz:

return queryResult.SingleOrDefault(); // as PermissionsAndPages 
İlgili konular