1

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

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 项),如果我使用快速视图检查模型,现在将失败,并显示“对象引用未设置为对象的实例”,现在它显示了这个

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

无论是否有任何结果,它之前都显示过。

4

2 回答 2

1

问题是 linq 有翻译

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

在 sql 中。你可以试试:

whereClause = whereClause.And(x => x.county.ToLower()==oSearch.County.ToLower());
于 2012-02-13T10:31:03.280 回答
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。

于 2012-02-13T11:30:19.553 回答