2016-03-23 9 views
2

Ich versuche, diese Linq zu fällenUmgestalten Linq Abfrage

var sys = db.tlkpSystems 
.Where(a => db.tlkpSettings.Where(e => e.Hidden < 3) 
.Select(o => o.System) 
.ToList().Contains(a.System))  //cannot get this part in? 
.OrderBy(a => a.SystemName).ToList(); 

foreach (var item in sys) 
    model.Add(new SettingSystem { 
     System = item.System, 
     SystemName = item.SystemName 
}); 

Ich habe versucht, die folgenden:

List<SettingSystem> model = new List<SettingSystem>(); 
    model = db.tlkpSettings.Where(e => e.Hidden < 3) 
    .OrderBy(e => e.Setting) 
    .Select(e => new SettingSystem 
    { 
     System = e.System, 
     SystemName = e.Setting 
     }).ToList(); 

Wie kann ich die .Contains nennen (a.System) Teil in meiner Anfrage ?

Dank

+0

@Mafii einen Grund, warum .ToList() sollte nicht verwendet werden? Ich bin neu in linq – Haris

+1

Ist das LINQ zu Entities Abfrage? –

+0

Ja. http://stackoverflow.com/questions/15516462/is-there-a-performance-impact-when-calling-tolist – uTeisT

Antwort

3

einige allgemeine Regeln, wenn sie mit LINQ to Entities arbeiten:

  • Vermeiden Sie ToList innerhalb der Abfrage. Es verhindert, dass EF eine korrekte SQL-Abfrage erstellt.

  • Verwenden Sie nicht Contains beim Arbeiten mit Entitäten (Tabellen). Verwenden Sie Any oder verbindet.

Hier ist Ihre Abfrage (bei System keine Einheit Navigationseigenschaft ist):

var sys = db.tlkpSystems 
    .Where(a => db.tlkpSettings.Any(e => e.Hidden < 3 && e.System == a.System)) 
    .OrderBy(a => a.SystemName).ToList(); 
+1

danke! Was ich war nach – Haris

+0

Scheint, dass die 'ToList()' nicht benötigt wird, da alles, was er tut, iteriert wird. –

+0

zu Liste wird benötigt, da ich eine Liste – Haris

1

Als Nachtrag gibt auch AsEnumerable für ist, wenn Sie müssen eine Abfrage in den Speicher ziehen (wie Aufruf von Methoden innerhalb einer anderen Klausel). Dies ist im Allgemeinen besser als ToList oder ToArray, da es die Abfrage aufzählt, anstatt sie aufzählen, zusammensetzen und dann diese Auflistung aufzählen.

+0

danke für die zusätzliche info :) – Haris