在Predicatebuilder中使用.Equals()失败

时间:2012-02-13 10:23:14

标签: c# linq-to-entities predicatebuilder

您好我正在使用Predicate构建器来构建我的where子句。  我注意到它正在对实体数据源进行区分大小写的比较。一些快速的谷歌搜索意味着这是linqtoentities的一个特点。所以我不得不修改我的代码来做

whereClause = whereClause.And(x => x.county.Equals(oSearch.County, StringComparison.OrdinalIgnoreCase ));

而不是以前做过

whereClause = whereClause.And(x => x.county == oSearch.County);

问题是现在似乎未能建立起一个地方。

顺便说一下,我正在使用之前正在运行的代码。

var tbl = db.tbl_members.AsExpandable().Where(whereClause.Compile());

我有一个代码,它执行一个foreach(模型中的var项),现在它失败了,“对象引用未设置为对象的实例” 如果我使用快速查看检查模型,它现在显示此

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], 
...
不管是否有任何结果,它先前显示的

2 个答案:

答案 0 :(得分:1)

问题是linq有翻译

whereClause = whereClause.And(x =>
x.county.Equals(oSearch.County,StringComparison.OrdinalIgnoreCase )

在sql中。你可以尝试:

whereClause = whereClause.And(x => x.county.ToLower()==oSearch.County.ToLower());

答案 1 :(得分:0)

鉴于此:

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。