2017-06-30 56 views
0

我有以下的說法得到具體項目:通過LINQ

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

我想通過一個不包括的項目限制結果當值HideUntilDate = null,並且HideUntilDate> today'date!基於我剛纔已經發布了另一個問題,我的想法是這樣的:

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

這似乎並不工作,實體是不是在where子句中的認可。任何人?

回答

3

LINQ方法需要委託(或表達式,如果你正在做可查詢的話)。

LINQ方法鏈中的一個方法的委託沒有以任何方式延續到鏈中的下一個方法。您需要編寫使用委託語法每個方法:

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

注意添加entity =>調用.Where內。

這是必要的。編譯器不會將此委託參數從Select方法轉移到下一步。

但是,這會給你另一個錯誤,entity沒有HideUntilDate。這是爲什麼?

因爲Where委託對.Select的結果進行操作,.Select是一個新的匿名對象,只有ArticleIdImagePath

幸運的是,解決方法是簡單,開關周圍的兩種方法的順序:

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

這將構建匿名對象之前進行過濾。

1

試試這個下面的代碼

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