Сгенерированный SQL с PredicateBuilder, LINQPad и оператором ЛЮБОЙ

Ранее я задавал вопрос об условиях объединения в 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.

Как я могу увидеть сгенерированный SQL, если LINQPad не работает?

РЕДАКТИРОВАТЬ

Если я напишу

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

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

ColorLanguages.Where(predColorLanguage).Dump();

работает... WTF?

1 ответ

Решение

Поскольку вы используете LINQKit, вы можете выполнить эту работу, вызвав Compile() для выражения, которое передает EntitySet, а затем вызвав 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.

Другие вопросы по тегам