Расширение LINQ, которое я написал, не будет работать с Entity Framework - PullRequest
2 голосов
/ 18 июля 2011

У меня есть метод расширения, определенный следующим образом:

public static TSource MaxBy<TSource, TResult>(this IEnumerable<TSource> collection, Func<TSource, TResult> func) where TSource : class
{
    var comparer = Comparer<TSource>.Default;
    TSource maxItem = null;
    foreach (var item in collection)
    {
        if (comparer.Compare(item, maxItem) > 0)
            maxItem = item;
    }
    return maxItem;
}

, который я затем использую в следующем запросе LINQ-to-Entities:

var balancesQuery = from t in db.Transactions
                    where t.UserId == userId
                    group t by t.CurrencyCode into tg
                    let tMaxDate = tg.MaxBy(i => i.TsCreate)
                    join c in db.Currencies on tg.Key equals c.CurrencyCode
                    select new { Currency = c, Balance = tMaxDate.Balance }

Итак, что я делаюis - получить самую новую транзакцию (MaxBy TsCreate) в каждой валюте (сгруппировать по CurrencyCode), а затем выбрать баланс по каждой из этих транзакций.

Моя проблема в том, что не работает сEntity Framework (LINQ-to-Entities; я получаю:

LINQ to Entities не распознает метод 'Transaction MaxBy [Transaction, DateTime] (System.Collections.Generic.IEnumerable' [Transaction],System.Func'2 [Transaction, System.DateTime]) ', и этот метод нельзя преобразовать в выражение хранилища.

Тот же запрос работает с LINQ to SQL.

Мои вопросы:

  1. Есть ли способ заставить его работать с Entity Framework?
  2. Или, возможно, есть лучший способ запрашивать ту же информацию, которая будет работать сEntity Framework?

Заранее спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 18 июля 2011

Не является ли запрос таким же, как:

var balancesQuery = from t in db.Transactions
                    where t.UserId == userId
                    group t by t.CurrencyCode into tg
                    join c in db.Currencies on tg.Key equals c.CurrencyCode
                    select new { 
                        Currency = c, 
                        Balance = tg.OrderByDescending(i => i.TsCreate).Take(1).Balance 
                    };
0 голосов
/ 18 июля 2011

Вы не можете использовать расширения с запросами LINQ, которые фактически извлекают данные из базы данных, так как это невозможно превратить в SQL. Однако вы можете сделать это, возвращая результаты в память, используя ToArray() или ToList(), чтобы инициировать выполнение запроса к базе данных, а затем вызывать функции расширения для результирующих реальных данных в памяти.

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