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

问题描述 投票:-2回答:1
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()方法

c# entity-framework linq filter iqueryable
1个回答
1
投票

所以你有一个带有DateTime的类Items?物业EntryDate。并且您需要为谓词构建器输入一个`Expression>,它表示如果Items.EntryDate的字符串表示包含一些searchText,则返回true的谓词。

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

如果EntryDate为null,你没有指定你想要的东西。我假设你想要返回false。

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

您可以在PredicateBuilder中使用它。

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

© www.soinside.com 2019 - 2024. All rights reserved.