Je dois faire un peu de filtrage sur un objet pour obtenir les entités dont j'ai besoin en faisant ceci: plus tard dans le code (et avant de lancer l'exécution différée) Je filtre la requête à nouveau. comme ceci: p> qui fonctionne assez bien jusqu'à présent. p> Voici mon problème: p> Les entités contiennent une Je dois filtrer les entités pour obtenir uniquement ceux qui font partie d'une collection ... et sur et sur toutes les périodes de la collection. P> J'ai essayé de faire cela: p> mais une fois que j'ai lancé l'exécution différée, elle traduit cela en SQL comme je le veux (un filtre pour chacune des périodes de temps pour autant de périodes dans la collection), mais cela se traduit par des comparaisons au lieu de ou des comparaisons, qui ne renvoie aucune entité du tout, puisqu'une entité ne peut pas être une partie de plus d'une période de temps, évidemment. p> Je dois construire une sorte de linq dynamique ici pour agréger les filtres de la période. P> update Strong> P> Basé sur la réponse de Hatten, j'ai ajouté le membre suivant: P>
query = query.AsEnumerable()
.Where(de => ratePeriods
.Any(rp => rp.DateFrom <= de.Date && rp.DateTo >= de.Date))
.ToQueryable();
4 Réponses :
Que diriez-vous de ce code:
[TestMethod] public void CorrectComplexOrOperatorTestWithInMemoryObjects() { var inMemoryRatePeriods = new List<RatePeriod> { new RatePeriod {ID = 1000, From = new DateTime(2002, 01, 01), To = new DateTime(2006, 01, 01)}, new RatePeriod {ID = 1001, From = new DateTime(1963, 01, 01), To = new DateTime(1967, 01, 01)} }; var allAffectedPosts = DatabaseContext.Posts.AsEnumerable() .Where( post => inMemoryRatePeriods.Any( period => period.From < post.PostDate && period.To > post.PostDate)); Assert.AreEqual(3, allAffectedPosts.Count()); }
C'est une bonne idée en effet! Malheureusement, cela me donne cette erreur: Impossible de créer une valeur constante de type 'Remperiod'. Seuls les types de primitifs ou les types d'énumération sont pris en charge dans ce contexte i>. Pourquoi donc ? Dois-je projeter les deux types DateTime de l'objet RempePeriod avant d'appeler la méthode? Comment pourrais-je y parvenir?
Wow, merci beaucoup pour votre temps à ce sujet. Je prendrai du temps ce week-end pour vérifier et je reviendrai à vous. Ceci est très apprécié.
@ FEO2X, ce que vous dites honnêtement n'a aucun sens du tout. La méthode que j'ai fournie n'a rien à voir avec iquéryable
ienumerable
où code> méthode avec
a => A code> ou une autre requête.
Salut les gars, j'ai écrit une mise à jour n ° 2 dans ma question initiale.
@hattenn: une expression LINQ peut être distinguée d'une requête de linq normale par le system.linq.expressions.expression.expression
beaucoup plus simple
iEnumerable
iquéryable
@ FEO2X, cette partie des arbres d'expression est correcte, vous êtes juste sur cela.
Vous pouvez utiliser une méthode comme ci-dessous: , puis: p> Pour plus d'informations, vous voudrez peut-être vérifier sur les éléments suivants: p> combinant deux expressions (expression http: //www.albahaari. com / noix / noix / prédicatebuilder.aspx p> s'il n'y a rien dans Pourquoi pourquoi le Lambda est expression
Combinez-et-code> La méthode nécessite deux méthodes pour combiner, si vous écrivez
Expression
résultat "/ code> pour commencer, vous ne pouvez pas l'utiliser dans votre boucle. P>
n => faux code>. Parce qu'il n'a aucun effet dans une instruction
ou code>. Par exemple,
FALSE ou SOMEXPRESSION ou SOMEXPRESSION CODE> est égal à
SOMEXPRESSION ou SOMEXPRESSION CODE>. Que
faux code> n'a aucun effet. P> p>
Je modifierai ma question à l'aide du code que vous avez suggéré dès que je peux résoudre ce problème: à la ligne expression
Désolé, n code> n'est pas un BOOL, il suffit de le remplacer par
n => false code>. C'était une erreur stupide de mon côté. Consultez mon édition à voir.
Merci. J'ai mis à jour ma question avec ma mise en œuvre de votre code et j'ai posé quelques questions supplémentaires.
J'ai fait une édition. Quant pourquoi votre requête ne fonctionne pas comme prévu, je n'ai aucune idée. Je ne peux voir aucun problème. Essayez de mettre un point de débogage à la ligne varocorytries = requête.where (résultatExpression.compile ())) Tolist (); Code> et consultez le contenu du
Résultat (code>.
Merci d'avoir expliqué. Je me débats en ce moment: essayant de comprendre pourquoi je ne peux pas voir ces filtres combinés dans le SQL traduit ...
Quoi qu'il en soit, je pense que la création dynamique de requête Linq n'était pas aussi simple que je pensais. Essayez d'utiliser l'entité SQL, similaire à celle ci-dessous: Cela peut ne pas être exactement correct (je ne l'ai pas essayé), mais cela devrait être quelque chose de similaire à celui-ci. P> p>
Malgré les bonnes suggestions, je devais aller avec la Voici comment j'ai résolu mon problème à l'aide de Linqkit: P> var documents = this.ObjectSet.AsExpandable().Where(predicate).ToList();
Pourquoi faites-vous
Query = Query.Seunumerable () code>? C'est pourquoi vous interrogez-vous ne fait pas partie de votre requête SQL? Je ne comprends pas le raisonnement derrière la convertir à l'énorme, puis de retourner à interrogatide.
C'était l'une des nombreuses façons que j'ai essayé de rendre la requête compréhensible par le fournisseur de Linq à entités. Malheureusement, l'omission de l'appel asénumérable () rend la requête inutilisable dans un contexte Linq à entités. Je reçois cette précédente: le type de nœud d'expression LINQ 'invoke' n'est pas pris en charge dans Linq aux entités.