Frage

Diese Abfrage funktioniert hervorragend:

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

Ich erhalte einen neuen Typ mit meinen „Op“-Feldern.Jetzt möchte ich auch meine 'pg'-Felder abrufen, aber

select op, pg).SingleOrDefault();

funktioniert nicht.

Wie kann ich alles aus beiden Tabellen auswählen, damit es in meinem neuen pageObject-Typ angezeigt wird?

War es hilfreich?

Lösung

Sie können hierfür anonyme Typen verwenden, d. h.:

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

Dadurch wird pageObject zu einem IEnumerable eines anonymen Typs, sodass Sie es AFAIK nicht an andere Methoden weitergeben können. Wenn Sie jedoch lediglich Daten zum Spielen in der Methode erhalten, in der Sie sich gerade befinden, ist das völlig in Ordnung.Sie können Eigenschaften auch in Ihrem anonymen Typ benennen, d. h.:-

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

Dadurch können Sie Folgendes sagen:

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

Zum Beispiel :-)

Andere Tipps

Wenn Sie keine anonymen Typen b/c verwenden möchten, sagen wir, Sie übergeben das Objekt an eine andere Methode, können Sie die LoadWith-Ladeoption verwenden, um zugehörige Daten zu laden.Es erfordert, dass Ihre Tabellen entweder über Fremdschlüssel oder in Ihrem Linq-to-SQL-DBML-Modell verknüpft sind.

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

Dann können Sie anrufen

pageObject.Pages.PageID

Abhängig davon, wie Ihre Daten aussehen, möchten Sie dies wahrscheinlich umgekehrt tun.

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;

Sie müssen einen neuen anonymen Typ erstellen:

 select new { op, pg }

Wenden Sie sich an den Beamten Führung.

Wenn Ihnen der anonyme Typ Probleme bereitet, können Sie eine einfache Datenklasse erstellen:

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

und dann in Ihrer Anfrage:

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

Dann können Sie das weitergeben:

return queryResult.SingleOrDefault(); // as PermissionsAndPages

ändern

select op) 

Zu

select new { op, pg })
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top