Unterabfrage in die Where-Klausel der LINQ-Anweisung
Also versuchte ich zu Folgen, diese Beispiel um eine sub-query in der where-Klausel dieser LINQ-Abfrage.
var innerquery =
from app in context.applications
select new { app.app_id };
IEnumerable<postDatedCheque> _entityList = context.postDatedCheques
.Where(e => innerquery.Contains(e.appSancAdvice.application.app_id));
War das Ziel, wählen Sie die Datensätze aus postDatedCheques, die app_id in Anwendungen Tabelle.
Aber ich erhalte folgenden Fehler in der where-Klausel:
- Delegat " System.Func' nicht
nehmen Sie 1 Argumente - Nicht in der lambda-Ausdruck zum Typ "string", weil es nicht
ein Delegat-Typ - "- System.Linq -.IQueryable' nicht enthalten
definition für 'Contains', und die beste Erweiterung Methode überladen
'System.Linq -.ParallelEnumerable.Contains(System.Linq -.ParallelQuery,
TSource)' hat einige ungültige Argumente - Instanz argument: cannot convert from
'System.Linq -.IQueryable' zu
'System.Linq -.ParallelQuery'
Was bin ich die Codierung falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, ein einfaches join würde die Arbeit machen. Es filtert die "Schecks", die keine relativen 'app':
Edit:
Lösungen mit einem
.Contains(...)
übersetzt werden in eine SQLIN
- Anweisung. Die sehr ineffizient sein. Linqjoin
ist übersetzt in SQLINNER JOIN
ist sehr effizient, wenn dein DB-schema ist gut getrimmt (FKs, index)Was?
Und wenn Sie möchten, verwenden Sie zwei Aussagen, das erste als Ausdruck der Funktion.
innerquery
ist ein IQueryable der anonyme Typ, der enthält eineapp_id
.Die Linie
Contains(e.appSancAdvice.application.app_id)
macht keinen Sinn, dae.appSancAdvice.application.app_id
und der anonymen Art sind nicht vom gleichen Typ sind.Einfach:
Versuchen Sie dies:
[..] e => innerquery.Any(a => a.app_id == a.appSansAdvice.application.app_id) [..]