Sous-requête dans la Clause where de LINQ déclaration
J'ai donc essayé de suivre cette exemple d'avoir une sous-requête dans la clause where de cette requête LINQ.
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));
L'objectif était de sélectionner les enregistrements à partir de postDatedCheques qui ont app_id dans applications table.
Mais je suis arriver suite à des erreurs dans la clause where:
- Délégué " Du Système.Func " n'
prendre 1 arguments - Ne peut pas convertir expression lambda de type 'string', car il n'est pas
un délégué de type - 'Système.Linq.IQueryable' ne contient pas de
définition pour le terme "Contient" et la meilleure méthode d'extension de surcharge
'Système.Linq.ParallelEnumerable.Contient(Le Système.Linq.ParallelQuery,
TSource)' a certains arguments non valides - Instance argument: impossible de convertir de
'Système.Linq.IQueryable' à
'Système.Linq.ParallelQuery'
Que suis-je le codage incorrect?
Vous devez vous connecter pour publier un commentaire.
Je pense qu'une simple jointure pour faire le travail. Il va filtrer les "chèques" qui n'ont pas par rapport 'app':
Edit:
Solutions à l'aide d'un
.Contains(...)
sera traduit en SQLIN
déclaration. Ce qui sera très inefficace. Linqjoin
est traduit en SQLINNER JOIN
qui est très efficace si votre DB schéma est bien garni (FKs, index)Sur quoi?
Et si vous souhaitez utiliser deux états, définissez le premier comme une expression de la fonction.
innerquery
est un IQueryable de type anonyme qui contient unapp_id
.La ligne
Contains(e.appSancAdvice.application.app_id)
n'a pas de sens puisquee.appSancAdvice.application.app_id
et de l'anonyme de type ne sont pas du même type.Il suffit de faire:
Essayez plutôt ceci:
[..] e => innerquery.Any(a => a.app_id == a.appSansAdvice.application.app_id) [..]