Сгенерированный 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.