动态LINQ-动态,服务器端Where子句
我一直在阅读动态LINQ和谓词生成器。我对一些后端物流有点不清楚,也有点困惑。我试图为我的一个应用程序提供一个reports/advanced search选项,其中涉及一个讨厌的groupwise max查询 我可以轻松地将其组合在一起以编程方式过滤结果,但是,出于性能原因,我当然更希望在SQL server上执行where子句,而不是在.net代码中执行。我不确定哪些解决方案实际上在SQL中执行谓词,而不是在client/.NET端执行谓词。下面是我想用LINQ做的一个例子:动态LINQ-动态,服务器端Where子句,linq,dynamic,where-clause,Linq,Dynamic,Where Clause,我一直在阅读动态LINQ和谓词生成器。我对一些后端物流有点不清楚,也有点困惑。我试图为我的一个应用程序提供一个reports/advanced search选项,其中涉及一个讨厌的groupwise max查询 我可以轻松地将其组合在一起以编程方式过滤结果,但是,出于性能原因,我当然更希望在SQL server上执行where子句,而不是在.net代码中执行。我不确定哪些解决方案实际上在SQL中执行谓词,而不是在client/.NET端执行谓词。下面是我想用LINQ做的一个例子: from fb
from fbd in db.FooBarDatas
join max_fbd in
(from fbd in db.FooBarDatas
group fbd by new { fbd.FooID, fbd.BarID } into grp
select new { MaxFooBarDataID = grp.Max(fbd => fbd.FooBarDataID }
)
on fbd.FooBarDataID equals max_fbd.MaxFooBarDataID
select new
{
FooBarDataID = fbd.FooBarDataID,
NormalizedPropertyName1 = fbd.Column1,
NormalizedPropertyName2 = fbd.Column2,
NormalizedPropertyName3 = fbd.Column3,
etc...
}
这是我的基本问题。最后,我将它们全部放入一个通用链接数据对象中,因为我希望从查询中动态提取的大量数据来自外部表,并且我希望它们都作为直接属性引用
现在我想要一种方法,可以向这个查询添加一大堆“where”子句条件,以便生成一个有意义的报告。根据用户给定的参数,“where”子句将有所不同。记录集相当大,所以我再次寻找一种在SQL端进行过滤的方法
有谁能提供一个简单的例子来说明如何做到这一点?提前感谢您的帮助。我相信我在看到一篇相当奇怪的文章标题后找到了答案 在请求迭代器之前,IQueryable似乎不会实际执行任何类型的TSQL编译。下面是一个非常简单的例子:
// this does not actually call a TSQL query
IQueryable<FooBar> q = (from fb in db.FooBars select fb);
// this line still does not call a TSQL query
q = q.Where(fb => fb.FooID == 3);
// this line still does not call a TSQL query
q = q.Where(fb => fb.BarID == 74)
// this line finally compiles a TSQL statement, calls the query, and
// gathers the results:
List<FooBar> results = q.ToList();
//这实际上并不调用TSQL查询
IQueryable q=(从db.FooBars中的fb选择fb);
//此行仍然不调用TSQL查询
q=q.Where(fb=>fb.FooID==3);
//此行仍然不调用TSQL查询
q=q.Where(fb=>fb.BarID==74)
//这一行最后编译一个TSQL语句,调用查询,然后
//收集结果:
列表结果=q.ToList();
IQueryable对象是按需评估对象。在尝试之后,我发现一些充斥着UDF的非常复杂的语句仍然在几乎瞬间返回。另一篇解释此筛选与服务器端筛选之间区别的文章可以在这里找到:
我希望这能帮助其他想做我正在做的事情的人。我相信我在遇到一篇相当奇怪的文章标题后找到了答案 在请求迭代器之前,IQueryable似乎不会实际执行任何类型的TSQL编译。下面是一个非常简单的例子:
// this does not actually call a TSQL query
IQueryable<FooBar> q = (from fb in db.FooBars select fb);
// this line still does not call a TSQL query
q = q.Where(fb => fb.FooID == 3);
// this line still does not call a TSQL query
q = q.Where(fb => fb.BarID == 74)
// this line finally compiles a TSQL statement, calls the query, and
// gathers the results:
List<FooBar> results = q.ToList();
//这实际上并不调用TSQL查询
IQueryable q=(从db.FooBars中的fb选择fb);
//此行仍然不调用TSQL查询
q=q.Where(fb=>fb.FooID==3);
//此行仍然不调用TSQL查询
q=q.Where(fb=>fb.BarID==74)
//这一行最后编译一个TSQL语句,调用查询,然后
//收集结果:
列表结果=q.ToList();
IQueryable对象是按需评估对象。在尝试之后,我发现一些充斥着UDF的非常复杂的语句仍然在几乎瞬间返回。另一篇解释此筛选与服务器端筛选之间区别的文章可以在这里找到:
我希望这能帮助其他想做我正在做的事情的人