Как составить запрос Entity Framework из более мелких, пригодных для повторного использования запросов?

В моем приложении есть несколько (довольно избыточных) запросов, которые выглядят примерно так:

var last30Days = DateTime.Today.AddDays(-30);

from b in Building
let issueSeverity = (from u in Users
                     where u.Building == b
                     from i in u.Issues
                     where i.Date > last30Days
                     select i.Severity).Max()
select new
{
    Building = b,
    IssueSeverity = issueSeverity
}

И:

var last30Days = DateTime.Today.AddDays(-30);

from c in Countries
let issueSeverity = (from u in Users
                     where u.Building.Country == c
                     from i in u.Issues
                     where i.Date > last30Days
                     select i.Severity).Max()
select new
{
    Country = c,
    IssueSeverity = issueSeverity
}

Это, конечно, упрощенный пример. Однако суть в том, что мне нужно перехватить дату и отфильтровать по ней подзапрос. Мне также нужно фильтровать подзапрос по-разному в зависимости от родительского объекта.

Я попробовал (по сути) создать следующую функцию:

public IQueryable<int?> FindSeverity(Expression<Func<User, bool>> predicate)
{
    var last30Days = DateTime.Today.AddDays(-30);

    return from u in Users.Where(predicate)
           from i in u.Issues
           where i.Date > last30Days
           select i.Severity;
}

Используя ее следующим образом:

from c in Countries
let issueSeverity = FindSeverity(u => u.Building.Country == c).Max()
select new
{
    Country = c,
    IssueSeverity = issueSeverity
}

Это компилируется, но не работает во время выполнения. Entity frameworks жалуется на то, что функция FindSeverity неизвестна.

Я пробовал несколько различных методов гимнастики Expression, но безрезультатно.

Что мне нужно сделать, чтобы составить многократно используемые запросы Entity Framework?

6
задан John Gietzen 25 April 2011 в 20:45
поделиться