У меня есть вопрос, связанный с моим предыдущим вопросом . В существующем бите LINQ, который включает несколько объединений , я пытаюсь взять каждый отдельный метод, включающий объединение, и преобразовать его в CompiledQuery .
Во-первых, обычный метод LINQ:
private IQueryable<Widget> GetWidgetQuery()
{
return db.Widgets.Where(u => (!u.SomeField.HasValue || !u.SomeField.Value));
}
И здесь определение делегата (поля) для CompiledQuery по этим строкам:
private static readonly Func<DBDataContext, IQueryable<Widget>> GetWidgetQuery =
CompiledQuery.Compile((DBDataContext db) =>
db.Widgets.Where(u => (!u.SomeField.HasValue || !u.SomeField.Value)));
Если навести указатель мыши на обычный оператор LINQ для метода GetWidgetQuery () , я увижу, что это метод , как показано ниже:
(method) IQueryable<Widget> GetWidgetQuery()
Однако делегат скомпилированного запроса ( поле ) отличается следующим образом:
(field) Func<DBDataContext, IQueryable<Widget>> GetWidgetQuery
После выполнения последнего как части оператора LINQ синтаксис отличается следующим образом. Во-первых, обычное участие LINQ в объединении:
var myquery =
from wxr in GetWidgetXRQuery()
join w in GetWidgetQuery() on wxr.WidgetID equals w.ID
select new DTO.WidgetList
{
...
}
И вот, вызов CompiledQuery в виде делегата:
var myquery =
from wxr in GetWidgetXRQuery()
join w in GetWidgetQuery.Invoke(myContext) on wxr.WidgetID equals w.ID
select new DTO.WidgetList
{
...
}
Первый возвращает ожидаемый набор результатов; последнее, когда я пытаюсь myquery.ToList () , выдает stackoverflow исключение, отчасти связанное с этим ограничением .NET 3.5 , я думаю.
Может кто-нибудь помочь мне понять, как скомпилированный оператор, существующий как поле (или, я думаю, я должен сказать делегат), а не метод, убивает мой запрос? Короче говоря, я знаю, что я делаю неправильно, но я не уверен, что понимаю, что я неправильно понимаю.