2017-06-30 2 views
0

Ich habe die folgende Aussage:bekommen bestimmte Elemente von LINQ

return articles.Select(entity => new OrderCateringArticleViewModel 
{ 
    ArticleId = entity.Id, ImagePath = entity.ImagePath 
}) 

Ich möchte die Ergebnisse durch eine NICHT einschließlich der Elemente begrenzen, wenn der Wert HideUntilDate = null und HideUntilDate> today'date!. Basierend auf einer anderen Frage, die ich früher geschrieben hatte, dachte ich so etwas wie:

return articles.Select(entity => new OrderCateringArticleViewModel 
{ 
    ArticleId = entity.Id, ImagePath = entity.ImagePath 
}).Where(!(entity.HideUntilDate != null && entity .HideUntilDate.Value > DateTime.Today)); 

Dies scheint nicht zu funktionieren, ist Einheit in der where-Klausel nicht erkannt. Jemand?

Antwort

3

LINQ-Methoden erfordern Delegaten (oder Ausdrücke, wenn Sie Abfragen ausführen).

Der Delegat einer Methode in einer LINQ-Methodenkette überträgt sich in keiner Weise auf die nächste Methode in der Kette.

return articles 
    .Select(entity => new OrderCateringArticleViewModel 
    { 
     ArticleId = entity.Id, ImagePath = entity.ImagePath 
    }) 
    .Where(entity => !(entity.HideUntilDate != null && entity .HideUntilDate.Value > DateTime.Today)); 

Notiere die Zugabe von entity => innerhalb des Anrufs zu .Where: mit der Delegat Syntax Sie müssen jede Methode schreiben.

Dies ist notwendig. Der Compiler führt diesen Delegate-Parameter nicht von der Methode Select zum nächsten Schritt.

Dies wird Ihnen jetzt jedoch einen anderen Fehler geben, entity hat keine HideUntilDate. Warum das?

Da der Where Delegierten arbeitet auf den Ergebnissen der .Select, die mit nur ArticleId und ImagePath ein neues anonymes Objekt ist.

Zum Glück ist die Lösung ist einfach, schalten Sie die Reihenfolge der beiden Methoden an, um:

return articles 
    .Where(entity => !(entity.HideUntilDate != null && entity .HideUntilDate.Value > DateTime.Today)) 
    .Select(entity => new OrderCateringArticleViewModel 
    { 
     ArticleId = entity.Id, ImagePath = entity.ImagePath 
    }); 

Diese vor der Konstruktion anonyme Objekte filtert.

1

versuchen dieses folgenden Code

return articles.Where(!(entity.HideUntilDate != null && entity .HideUntilDate.Value > DateTime.Today)).Select(entity => new OrderCateringArticleViewModel 
{ 
    ArticleId = entity.Id, 
    ImagePath = entity.ImagePath 
}); 
Verwandte Themen