在Predicatebuilder中使用.Equals()失败
本文关键字:失败 Equals Predicatebuilder | 更新日期: 2023-09-27 18:24:23
嗨,我正在使用谓词生成器来构建where子句。我注意到它正在与实体数据源进行区分大小写的比较。一些快速的谷歌搜索暗示这是林克托恩提斯的一个特征。所以我不得不修改我的代码来进行
whereClause = whereClause.And(x => x.county.Equals(oSearch.County, StringComparison.OrdinalIgnoreCase ));
而不是以前做
whereClause = whereClause.And(x => x.county == oSearch.County);
现在的问题是,它似乎没有建立一个whereclause。
顺便说一句,我使用的是下面的代码,它以前是有效的。
var tbl = db.tbl_members.AsExpandable().Where(whereClause.Compile());
我有一段代码做foreach(模型中的var项),现在失败了,它显示"Object reference not set to a instance of a Object"如果我使用快速视图检查模型,它现在显示这个
tblMembers = {System.Linq.Enumerable.WhereEnumerableIterator<tbl_members>}
而不是
tblMembers = {SELECT [Extent1].[id] AS [id],
[Extent1].[membership_id] AS [membership_id],
[Extent1].[membership_type] AS [membership_type],
[Extent1].[institution] AS [institution],
[Extent1].[full_name] AS [full_name],
[Extent1].[address1] AS [address1],
...
不管是否有任何结果,它之前都显示了这一点。
问题是linq有的翻译
whereClause = whereClause.And(x =>
x.county.Equals(oSearch.County,StringComparison.OrdinalIgnoreCase )
在sql中。你可以试试:
whereClause = whereClause.And(x => x.county.ToLower()==oSearch.County.ToLower());
给定条件:
tblMembers = {System.Linq.Enumerable.WhereEnumerableIterator<tbl_members>}
看起来您无意中使用了LINQ to Objects。检查PredicateBuilder的副本实际上是按照表达式树(Expression<Func<T, bool>>
)还是委托(Func<T, bool>
)的形式——您应该使用表达式树。
编辑:正如评论中所指出的,这就是问题所在:
var tbl = db.tbl_members.AsExpandable().Where(whereClause.Compile());
这就是将表达式树编译为委托,然后调用Enumerable.Where
。没有Compile()
调用:
var tbl = db.tbl_members.AsExpandable().Where(whereClause);
我们最终使用表达式树调用Queryable.Where
,然后可以将其转换为SQL。