J'ai quelques prédicats en construction dynamique qui ont la signature suivante passe par en tant que paramètres en fonction:Dynamiquement recherche à l'aide LINQ et créé dynamiquement prédicats
Expression<Func<TblTableR, bool>> TableRPredicate,
Expression<Func<TblTableN, bool>> suspectNamesPredicate,
Expression<Func<TblTableS, bool>> TableSPredicate,
Expression<Func<TblTableI, bool>> suspectTableIPredicate,
Je suis en train d'interroger en utilisant les éléments suivants:
var registries = (from r in db.TblTableR.Where(TableRPredicate)
join s in db.TblTableS.Where(TableSPredicate)
on r.TblTableRID equals s.TblTableSTableRID into ss
from suspects in ss.DefaultIfEmpty()
join si in db.TblTableI.Where(suspectTableIPredicate)
on suspects.TblTableSIndexCardID equals si.TblTableIID into sisi
from suspectTableI in sisi.DefaultIfEmpty()
join sn in db.TblTableN.Where(suspectNamesPredicate)
on suspectTableI.TblTableIID equals sn.TblTableNIndexCardID into snsn
from suspectNames in snsn.DefaultIfEmpty()
select r.TblTableRID).Distinct();
Cela a pour résultat de mettre tout produit « where » dans la déclaration REJOIGNEZ par exemple:
left outer join tblTableI on tblTableITableRID = tblTableRID
AND (expression created by predicate)
Ce qui se passe réellement, c'est que le SQL final créé est incorrect. Il crée le type suivant de sql
select * from table1 left outer join table2 on field1 = field2
AND field3 = 'CRITERIA'
Il est cette clause AND à la fin qui est le problème - finissant par revenir trop de lignes. Essentiellement je voudrais obtenir la clause where dans la déclaration et ne pas la coller dans la jointure.
Quelque chose comme ceci:
select * from table1 left outer join table2 on field1 = field2
WHERE field3 = 'CRITERIA'
J'ai essayé d'ajouter une clause where comme suit:
...
...
...
select r.TblTableRID).Where(TableRPredicate).Distinct();
mais qui ne compilera pas en raison des paramètres génériques de chaque attribut.
Si je modifie ma requête LINQ pour ne sélectionner que dans une table et utiliser un prédicat, la clause WHERE est générée correctement.
Des idées?
Marc, J'ai mis à jour le poste pour faire des choses un peu plus clair . Peter –
OK; J'espère que cette mise à jour corrige les choses pour vous. –
Merci Marc, ça a résolu le problème! –