2

之前问过一个关于 Linq To Entities 中的链接条件的问题。现在我使用LinqKit,一切正常。我想查看生成的 SQL,在阅读了这个答案后,我使用了 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?

4

1 回答 1

2

当您使用 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();

正如LINQKit 文章中所解释的,Compile 方法实际上从未运行:AsExpandable 将其剥离并修改表达式树,以便它与 LINQ to SQL 一起使用。

于 2010-03-28T04:37:59.630 回答