LINQ-запрос, который вызывает некоторый метод для дополнительных вычислений - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть запрос linq, который нуждается в группировке по идентификатору для подсчета строк из 2 значений состояния, а затем я бы хотел вызвать метод, который выполняет вычисление на основе полученных значений.Возможно, кто-то может помочь мне понять лучший способ сделать это.Когда я запускаю это, я вижу исключение, что «calcRate» не распознается linq, но я делал что-то подобное раньше, и он отлично работает.Возможно, я тоже неправильно подхожу к этому:

var query = from c in (context.table
    .Where(s => s.date >= startDate && s.date <= endDate)
    .GroupBy(s => new { s.id })
    .Select(s => new
        {
            id = h.Key.id,
            rate = calcRate(h.Count(s=>s.status == 1), h.Count(s=>s.status != 3))
        }).ToList())
        select new { id = c.id, rate = c.rate };

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Вы должны выполнить ту часть, которую БД может выполнять в БД, а затем использовать .AsEnumerable(), чтобы вернуть результаты в .NET для завершения вычислений.

var query = context.table
    .Where(s => s.date >= startDate && s.date <= endDate)
    .GroupBy(s => s.id)
    .Select(s => new
        {
            id = s.Key,
            rateArg1 = s.Count(s=>s.status == 1),
            rateArg2 = s.Count(s=>s.status != 3)
        })
    .AsEnumerable()
    .Select(s => new { s.id, rate = calcRate(s.rateArg1, s.rateArg2)});
0 голосов
/ 29 ноября 2011

ваш linq верен, но часть вашего запроса linq, которая была до .ToList (), конвертируется в SQL EF, и он не знает, как конвертировать calcRate в SQL, вам придется делать calcRate после того, как вы получите все значения из sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...