В моем приложении есть несколько (довольно избыточных) запросов, которые выглядят примерно так:
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?