Сгенерированный SQL с PredicateBuilder, LINQPad и оператором ЛЮБОЙ - PullRequest
2 голосов
/ 26 марта 2010

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

EDIT

Если я напишу

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

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

ColorLanguages.Where(predColorLanguage).Dump();

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

1 Ответ

2 голосов
/ 28 марта 2010

Поскольку вы используете 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.

...