2017-06-26 5 views
0

Ich habe eine ziemlich komplexe SQL-Anweisung mit Joins. Hier ist mein Code mit EF:Verwenden (linq?) Mit ef-Entitäten

var MicrositeResponseAdors = _context.MicrositeResponseAdor 
    .Include(user => user.UserTracking) 
     .ThenInclude(tracking => tracking.AddTradeIn) 
    .Include(user => user.UserTracking) 
     .ThenInclude(tracking => tracking.TrackingFinance) 
    .Include(user => user.UserTracking) 
     .ThenInclude(tracking => tracking.SearchTracking) 
    .Include(user => user.UserTracking) 
     .ThenInclude(tracking => tracking.TrackingType) 
    .Include(user => user.UserTracking) 
     .ThenInclude(tracking => tracking.Vehicle) 
    .FirstOrDefault(m => m.Id == id && m.FirstName.ToLower() != "test" && m.LastName.ToLower() != "test"); 

Ich muss eine andere hinzufügen zu einem Tisch sitzen, die keinen Primärschlüssel hat, die Entity Framework nicht gestattet. Ich konnte es nicht einmal vortäuschen. Also wurde mir gesagt, ich solle etwas Brauchbarer machen mit dem, was ich glaube, heißt LINQ?

Ich kann nicht herausfinden, wie meine Datenwerte mit den ursprünglichen EF-Entity-Klassen zugeordnet werden. Hier ist, was ich bisher:

var MicrositeResponseAdors = (from p in _context.MicrositeResponseAdor 
    join c in _context.UserTracking on p.Id equals c.UserTrackingId 
    into pc 
    select new { 
     MicrositeResponseAdor = p, MicrositeResponseAdor.UserTracking = pc 
    } 
).FirstOrDefault(); 

Das gibt:

ungültig anonymen Typ Mitglied declarator.

Ich denke, das ist wegen des ersten Teils von MicrositeResponseAdor.UserTracking. Ich bin nicht sicher, wie man UserTracking unter dem MicrositeResponseAdor zuweist.

+0

Joins in einem ORM sind ein extrem starker Geruch. ORMs behandeln * Objekte * mit * Relationen *. ORMs sind keine Datenbanken und LINQ ist kein Ersatz für SQL. –

+0

Sie müssen der MicroSiterResponseAdor-Klasse eine weitere * Relation * hinzufügen. Wahrscheinlich nur ein 'public UserTracking UserTracking {get; set;}'. EF wird die Beziehung erkennen, wenn die Tabellen, Felder den Konventionen folgen, was sie zu tun scheinen. Die Abfrage muss sich überhaupt nicht ändern. –

+0

BTW der von Ihnen gepostete EF-Code zeigt keine Joins. Nur eine * einzelne * Entity lädt. All diese 'Includes' erzwingen eifriges Laden, sie haben überhaupt nichts mit Joins zu tun.Sie könnten sie sogar loswerden, wenn Sie kein eifriges Laden benötigen –

Antwort

0

Der Fehler, den Sie angegeben haben, ist ein C# -Kompilierungsfehler, da Sie versuchen, eine Eigenschaft MicrositeResponseAdor.UserTracking zu benennen. Eigenschaftsnamen dürfen keine Punkte enthalten.

mindestens kompilieren Dies würde:

var micrositeResponseAdor = (
    from p in _context.MicrositeResponseAdor 
    join c in _context.UserTracking on p.Id equals c.UserTrackingId into pc 
    select new { 
     MicrositeResponseAdor = p, 
     UserTracking = pc 
    } 
).FirstOrDefault(); 

Dadurch wird Ihr UserTracking an zwei Stellen erscheinen:

  1. micrositeResponseAdor.UserTracking
  2. micrositeResponseAdor.MicrositeResponseAdor.UserTracking

Es ist in der ersten, weil Sie hab es dort hingelegt, und Es ist in der Sekunde, weil es sowieso eine Beziehung zwischen den Entitäten gibt, also füllt EF es bequem, wenn es es in diesem Kontext geladen hat (und es hat, weil Sie explizit danach gefragt haben).

So müssen Sie geladene Navigationseigenschaften in Ihrer Abfrage nicht zuweisen, Sie müssen nur sicherstellen, dass die verbundenen Entitäten geladen sind, entweder mit einem manuellen Join, einer Include oder sogar einer zweiten Abfrage.

Die Frage ist, warum Sie das überhaupt tun. Sie hatten bereits die Include Version. Die Join-Variante ist nur etwas ausführlicher, fügt aber nichts hinzu.

Nicht, dass EF immer einen Schlüssel für jede Entität hat, egal ob die Datenbank denkt, dass es eine ist oder nicht. Technisch gesehen ist das nicht verwandt Include vs join obwohl.