Supposons que j'ai une table jointe à 2 dans une fonction qui renvoie un IQueryable, mais la sortie est un type nommé qui n'est ni l'un ni l'autre tables:Pouvez-vous ajouter un Where() à un IQueryable lorsque le champ n'est pas dans la sortie sélectionnée?
var qry = from p in Persons
join h in Hobbies on p.PersonId equals h.PersonId
select new OutputType
{
Name = p.FirstName,
Hobby = h.HobbyName
}
return qry
Disons que maintenant, je voulais prendre ce retour requête et faire quelque chose comme:
var newQuery = qry.Where(p=>p.Age > 18)
comme vous pouvez le voir c'est un problème parce que le IQueryable est de type OutputType, donc je peux N'ajouter un où à l'âge d'une personne à moins que je devais ajouter l'âge à OutputType. Y a-t-il un moyen de 'pénétrer' dans l'arbre d'expression de IQueryable et d'ajouter un lambda qui va interroger la collection source spécifiée et lui ajouter une clause Where? Ou dois-je dois-je ajouter un champ Where au OutputType même si je ne suis pas intéressé à le projeter en fin de compte?
Bien que je pense que vous pourriez trouver un moyen de le faire si vous vouliez vraiment, vraiment il est juste un signe que votre conception est erronée, et vous devez structurer votre code tel que vous faites le filtrage avant projeter la séquence. – Servy
Peut-être que vous pourriez reconcevoir un peu et transmettre la valeur de 'Persons'. Donc, à la place de 'Persons' vous passeriez dans' Persons.Where (p => p.Age> 18) ' –
L'exemple que j'ai donné était juste cela, un exemple. Je montrais juste le concept, pas l'utilisation. Le cas réel est une jointure à 4 tables au-dessus d'une base de données Oracle héritée existante. J'ai 3 variations différentes de la même requête (grande), ne différant que par la clause Where sur les valeurs non-projetées des différentes tables. J'essaye de réduire la redondance dans le code ainsi je ne maintiens pas plusieurs grandes requêtes LINQ. La première réponse ci-dessous est très utile car je ne suis pas pénalisé pour avoir ajouté un champ dès le début et ne pas le projeter en fin de compte. Le seul point négatif est d'avoir à faire plusieurs nouveaux types. –