我有一个像这样定义的扩展方法:
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 }
所以我正在做的是 - 获取每种货币的最新交易(MaxBy TsCreate)(按CurrencyCode分组),然后针对每个交易选择余额。
我的问题是 - 这个不起作用与实体框架(LINQ到实体;我得到:
LINQ to Entities无法识别方法'Transaction MaxBy [Transaction,DateTime](System.Collections.Generic.IEnumerable'[Transaction],System.Func'2 [Transaction,System.DateTime])'方法,这个方法无法转换为商店表达式。
相同的查询适用于LINQ to SQL。
我的问题是:
提前感谢您的帮助!
答案 0 :(得分:2)
查询不同于:
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
};
答案 1 :(得分:0)
您无法使用实际从数据库中提取数据的LINQ查询扩展,因为无法将其转换为SQL。但是,您可以通过使用ToArray()
或ToList()
将结果返回到内存中来触发数据库查询执行,然后在内存中生成的实际数据上调用扩展函数。