2008-08-28 11 views
48

Ta kwerenda działa świetnie:Tworzenie LINQ wybrać z wielu tabel

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

mam nowego typu z mojego pól "op. Teraz chcę odzyskać również moje pola "pg", ale nie działa. Nie działa.

Jak mogę wybrać wszystko z obu tabel, aby pojawiły się w moim nowym typie obiektu pageObject?

Odpowiedz

79

Można używać typów anonimowych za to, tj:

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

To sprawi pageObject do IEnumerable anonimowego typu tak AFAIK nie będziesz w stanie przekazać go innym metodom, jeśli jednak po prostu uzyskasz dane do wykorzystania w metodzie w tej chwili jesteś w doskonałej formie. Można również wymienić właściwości w anonimowej typu, a mianowicie: -

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

To pozwoli Ci powiedzieć: -

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

Na przykład :-)

2

Musisz utworzyć nowy typ anonimowy:

select new { op, pg } 

posługiwać się oficjalnym guide.

1

zmiana

select op) 

do

select new { op, pg }) 
6

Jeśli nie chcesz aby używać typów anonimowych b/c powiedzmy, że przekazujesz obiekt do innej metody, możesz użyć opcji LoadWith load, aby załadować powiązane dane. Wymaga to, aby tabele były powiązane za pomocą kluczy obcych lub w modelu dbml-do-SQL dbml.

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 

Następnie można wywołać

pageObject.Pages.PageID 

W zależności od tego, co dane wygląda, to prawdopodobnie chcesz to zrobić na odwrót,

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

Jeżeli typ anonimowy powoduje kłopoty, możesz utworzyć prostą klasę danych:

public class PermissionsAndPages 
{ 
    public ObjectPermissions Permissions {get;set} 
    public Pages Pages {get;set} 
} 

a następnie w zapytaniu:

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

Następnie można przekazać to około:

return queryResult.SingleOrDefault(); // as PermissionsAndPages