【问题标题】:Dynamic LINQ - Dynamic, Server Side Where Clause动态 LINQ - 动态的服务器端 Where 子句
【发布时间】:2011-06-02 16:07:39
【问题描述】:

我一直在阅读动态 LINQ 和谓词构建器。我对一些后端物流有点不清楚和困惑。我正在尝试为我的一个应用程序提供报告/高级搜索选项,其中涉及令人讨厌的 groupwise-max 查询。

我可以轻松地将它们组合在一起以编程方式过滤结果,但是出于性能原因,我当然更喜欢在 SQL 服务器上执行 where 子句,而不是在 .net 代码中。我不确定哪些解决方案实际上在 SQL 而不是客户端/.NET 端执行谓词。这是我想用 LINQ 做的一个例子:

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 端进行过滤的方法。

谁能提供一个简单的例子来说明如何做到这一点?提前感谢您的帮助。

【问题讨论】:

    标签: linq dynamic where-clause


    【解决方案1】:

    我相信我是在看到一个相当奇怪的文章标题后找到了答案。

    http://www.weirdlover.com/2010/05/11/iqueryable-can-kill-your-dog-steal-your-wife-kill-your-will-to-live-etc/

    在请求迭代器之前,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();
    

    IQueryable 对象是按需评估对象。在尝试之后,我发现一些充斥着 UDF 的相当复杂的语句仍然几乎立即返回。可以在此处找到另一篇解释此过滤与服务器端过滤之间区别的文章:

    http://www.sellsbrothers.com/posts/details/12614

    我希望这可以帮助其他想要做我正在做的事情的人。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 2016-06-21
      相关资源
      最近更新 更多