在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], 
...

不管是否有任何结果,它之前都显示了这一点。

在Predicatebuilder中使用.Equals()失败

问题是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。