【问题标题】:C# LinqToSql build dynamic where clauseC# LinqToSql 构建动态 where 子句
【发布时间】:2014-10-29 14:25:03
【问题描述】:

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

使用上述相同信息,会生成一个面板(针对每个网格),其中包含过滤每列所需的字段。

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

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

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

我该怎么做?

提前致谢。

【问题讨论】:

  • 您引用的链接已经生成了一个Expression,可以使用.Where(expression) 将其应用于DbSet 或L2S Table。为什么不能直接将其应用到数据库而不是数据源?
  • 如果您使用的是 Linq2Sql,那么您的查询将返回一个 IQueryable 对象(为简单起见,它只是一个 SqlCommand 的包装器)。如果您将 Where 应用于 IQueryable,该 IQueryable 将被转换为 WHERE Sql 语句。这似乎解决了您的问题,或者我可能一开始没有理解您的担忧。
  • @Sphaso 我不能使用这样的语法:var query = some_linq 然后 query.Where (some_contraint);因为我不知道该字段的名称到表中应用 where 子句和所需的运算符。
  • @Skary Dynamic LINQ 会为您解决这个问题,但这可能更多的是设计问题而不是技术问题。

标签: c# linq-to-sql lambda


【解决方案1】:

1) 关于链接:查看this answer。它包含一些漂亮的谓词扩展方法。那里有完整的代码,没有用重复。案例研究:带有 Employee 类的 Northwind 模型。最终过滤器将包含来自西雅图或西澳地区的员工,并且标识符大于 10。与此处相关,仅远程执行基本查询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) 关于性能:恕我直言,这是 ADO.NET 中存在的断开与连接的范例(DataSetDataReader)。您应该衡量remote vs local query executioncompiled queries 的影响(顺便说一句,您如此热衷的动态过滤将减少为Enumerable.UnionEnumerable.Intersect 编译查询操作)。基准测试将向您展示最适合您的环境的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多