谓词条件在IQueryable中不起作用,但在将IQuaryable转换为ToList()之后起作用

时间:2019-02-21 11:34:13

标签: c# entity-framework linq filter iqueryable

var predicate = PredicateBuilder.New<Items>(true); predicate = predicate.Or(i => Convert.ToDateTime(i.Entrydate).ToString("M/d/yyyy").Contains(searchText));

({EntrydateDateTime?类型,因此我不能直接使用.ToString('M/d/yyyy')字符串格式)

这不起作用(例外:Must be reducible node

IQueryable<Items> items = Repository.GetItems(orderNo).Where(predicate);

这正在工作

IQueryable<Items> items = Repository.GetItems(orderNo).ToList().Where(predicate).AsQueryable();

但是当它们位于IQueryable

中时,我不想将结果转换为列表

请注意:我在谓词(动态)条件中使用Convert.ToDateTime()方法

1 个答案:

答案 0 :(得分:1)

因此,您有一个带有DateTime的Items类?属性EntryDate。并且您需要作为谓词构建器的输入,如果表达式的字符串表示形式包含Items.EntryDate包含某些searchText,则表示该谓词的Expression>。

换句话说,如果EntryDate等于“ 2003年12月23日”,则其字符串表示形式为“ 12/25/2003”,并且如果它包含searchText,则要返回true。

A,如果EntryDate为null,则您没有指定所需的内容。我假设您要返回false。

Expression<Func<Items, bool>> predicate = (items.EntryDate != null)
   && (items.EntryDate.ToString("M/d/yyyy").Contains(searchText));

您可以在PredicateBuilder中使用它。

顺便说一句:我认为比较DateTime的文本表示形式是不明智的。这是依赖文化的方式。