C#LinqToSql构建动态where子句

时间:2014-10-29 14:25:04

标签: c# linq-to-sql lambda

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

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

此刻我已经在我的项目中应用了此链接中描述的示例: http://www.codeproject.com/Tips/582450/Build-Where-Clause-Dynamically-in-Linq

使用动态where(linq)子句动态过滤我的表到表数据源(datasource只是在整个基础表上选择)。

我将实现的是优化,因为如果有大量数据,db提取可能会很昂贵。 因此,我将构建一个动态linq到sql where子句,而不是在包含所有表条目的列表上的动态linq查询。

我该怎么做?

提前致谢。

1 个答案:

答案 0 :(得分:0)

1)关于链接:看看this answer。它包含一些用于谓词的漂亮扩展方法。那里有完整的代码,没有重复使用。案例研究:使用Employee类的Northwind模型。最终过滤器将包含来自西雅图或西澳大利亚州的员工,其标识符大于10.此处相关,仅基本查询远程执行(a SELECT * FROM Employees), LINQ to 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一起存在的断开连接与连接的范例(DataSet vs DataReader)。您应该衡量remote vs local query executioncompiled queries的影响(顺便说一句,您热衷的动态过滤将减少到编译查询的Enumerable.UnionEnumerable.Intersect操作。基准测试将为您的环境提供最合适的解决方案。