您好我正在使用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],
...
不管是否有任何结果,它先前显示的。
答案 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。