C#LinqToSql生成动态where子句

本文关键字:where 子句 动态 C#LinqToSql | 更新日期: 2023-09-27 18:28:13

我有一个项目,其中我有一些动态构建的DataGrids(winform),它们是根据目录中一些xml文件中的一些配置生成的。事实上,每个DataGrid都有一个xml(该文件与DataGrid的名称相同),并且这个xml包含关于DataGrid的列和数据库表的信息,该网格应该绑定到这些列和表上

使用上面相同的信息,将生成一个面板(用于每个网格),其中包含筛选每列所需的字段。

目前,我已将此链接中描述的示例应用于我的项目:http://www.codeproject.com/Tips/582450/Build-Where-Clause-Dynamically-in-Linq

使用dynamicwhere(linq)子句将我的表动态筛选到表数据源上(数据源只是对底层表的一个选择)。

我要实现的是优化,因为如果有很多数据,数据库提取可能会很昂贵。因此,我将构建一个动态linq-to-sqlwhere子句,而不是对包含所有表条目的列表进行动态linq查询。

我该怎么做?

提前谢谢。

C#LinqToSql生成动态where子句

1)关于链接:看看这个答案。它包含一些漂亮的谓词扩展方法。完整的代码在那里,没有使用复制。案例研究:带有Employee类的Northwind模型。最终过滤器将包含来自西雅图或华盛顿地区的员工,并且标识符将大于10。相关的是,只有基本查询是远程执行的SELECT * FROM Employees),LINQ到SQL过滤在本地缓存上运行

Predicate<Employee> p1 = emp => emp.City == "Seattle";
Predicate<Employee> p2 = emp => emp.Region == "WA";
Predicate<Employee> p3 = emp => emp.EmployeeID > 10;
Predicate<Employee> orp1p1Andp3 = PredicateExtensions.OrAll(new[] { p1, p2}).And(p3);
//identical with
Predicate<Employee> orp1p1Andp3 = p1.Or(p2).And(p3);
//
var query = from emp in this.ctx.Employees select emp;
Func<Employee,bool> selector = emp=>orp1p1Andp3(emp);
dataGrid.ItemsSource = query.Where(selector);

2) 关于性能:Imho,这是ADO.NET中存在的断开连接与连接模式(DataSetDataReader)。您应该衡量远程与本地查询执行以及编译查询的影响(顺便说一句,您非常热衷的动态过滤将减少为编译查询的Enumerable.UnionEnumerable.Intersect操作)。基准测试将向您展示最适合您的环境的解决方案。