[英]Dynamic change of Where filters in linq
我正在尝试在我的应用程序中进行一些代码优化,并用一种方法替换执行相同操作的几种方法。 我需要使用各种过滤器执行此linq,但是在.Where(filter)部分出现设计时错误
Expression<Func<dbTable, bool>> filter;
switch (i)
{
case 1: filter = (p => p.f1 == ExternalParam);
case 2: filter = (p => p.f2 == ExternalParam);
}
var ds = (from tbl in dbEntities.dbTable
orderby tbl.f1
select new
{
f1 = tbl.f1,
f2 = tbl.f2,
f3 = tbl.f3,
f4 = tbl.f4,
}
).Where(filter);
错误是
Error 1 'System.Linq.IQueryable<AnonymousType#1>' does not contain a definition for 'Where' and the best extension method overload 'System.Linq.Queryable.Where<TSource>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,int,bool>>)' has some invalid arguments
Error 2 Argument 2: cannot convert from 'System.Linq.Expressions.Expression<System.Func<AppNameSpace.dbTable,bool>>' to 'System.Linq.Expressions.Expression<System.Func<AnonymousType#1,int,bool>>'
有人可以帮忙吗?
好,您的表达式类型为Expression<dbTable, bool>
并尝试将其应用于anonymous
类型(当执行select new
,您将投影到匿名类型),它不是... dbTable
因此,您应将谓词应用于IQueryable<dbTable>
: dbEntities.dbTable
应该是该类型。
var ds = from tbl in dbEntities.dbTable.Where(filter)
orderby tbl.f1
select new
{
f1 = tbl.f1,
f2 = tbl.f2,
f3 = tbl.f3,
f4 = tbl.f4,
};
顺便说一下,我发现在不需要时避免混合语法会更容易。
var ds = dbEntities.dbTable.Where(filter)
.OrderBy(m => m.f1)
.Select(m => new {
tbl.f1,
tbl.f2,
tbl.f3,
tbl.f4
});
但是,这只是个人PoV。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.