【问题标题】:Generated SQL with PredicateBuilder, LINQPad and operator ANY使用 PredicateBuilder、LINQPad 和运算符 ANY 生成 SQL
【发布时间】:2023-03-24 11:30:01
【问题描述】:

previously asked 有一个关于 Linq To 实体中的链接条件的问题。 现在我使用LinqKit,一切正常。 我想看看生成的SQL,看了this answer之后,我用LinqPad

这是我的声明:

var predProduct = PredicateBuilder.True<Product>();
var predColorLanguage = PredicateBuilder.True<ColorLanguage>();

predProduct = predProduct.And(p => p.IsComplete);

predColorLanguage = predColorLanguage.And(c => c.IdColorEntity.Products.AsQueryable().Any(expr));

ColorLanguages.Where(predColorLanguage).Dump();

代码在 VS2008 中工作,编译并生成正确的结果集,但在 LinqPad 中,我有以下错误:

NotSupportedException: The overload query operator 'Any' used is not Supported.

如果 LINQPad 失败,我如何查看生成的 SQL?

编辑

如果我写

var predColorLanguage = PredicateBuilder.True<ColorLanguage>();

predColorLanguage = predColorLanguage.And(c => c.IdColorEntity.Products.Any((p => p.IsComplete));

ColorLanguages.Where(predColorLanguage).Dump();

工作... WTF?

【问题讨论】:

    标签: dump linqpad predicatebuilder generated-sql


    【解决方案1】:

    当您使用 LINQKit 时,您可以通过在提供 EntitySet 的表达式上调用 Compile() 来完成这项工作,然后在主查询上调用 AsExpandable():

    var predProduct = PredicateBuilder.True<Product>();
    var predColorLanguage = PredicateBuilder.True<ColorLanguage>();
    
    predProduct = predProduct.And(p => p.IsComplete);
    
    predColorLanguage = predColorLanguage.And (
      c => c.IdColorEntity.Products.Any(predProduct.Compile()));
    
    ColorLanguages.AsExpandable().Where(predColorLanguage).Dump();
    

    作为explained in the LINQKit article,Compile 方法从未实际运行:AsExpandable 将其剥离并修改表达式树,以便它与 LINQ to SQL 一起使用。

    【讨论】:

    • 问题不在于 Visual Studio,而在于 LinqPad。在 Visual Studio 中,它可以正常工作。我已经尝试了您的解决方案,但没有成功。
    • 你在使用实体框架吗?如果是这样,您在 LINQPad 中连接时是否选择“自定义 EF 上下文”?如果您改为直接连接到 LINQPad 中的数据库,则您使用的是 LINQ to SQL,这可能会导致差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2023-03-18
    • 2022-01-13
    • 2013-01-08
    • 2021-04-04
    • 2018-10-23
    相关资源
    最近更新 更多