c# - LINQ to Entities 消息中仅支持无参数构造函数和初始值设定项

标签 c# linq linq-to-entities

我有一个从 EF 模型返回数据的方法。

我收到上述消息,但我不知道如何规避该问题。

    public static IEnumerable<FundedCount> GetFundedCount()
    {
        var today = DateTime.Now;
        var daysInMonth = DateTime.DaysInMonth(today.Year, today.Month);

        var day1 = DateTime.Now.AddDays(-1);
        var day31 = DateTime.Now.AddDays(-31);

        using (var uow = new UnitOfWork(ConnectionString.PaydayLenders))
        {
            var r = new Repository<MatchHistory>(uow.Context);

            return r.Find()
                .Where(x =>
                    x.AppliedOn >= day1 && x.AppliedOn <= day31 &&
                    x.ResultTypeId == (int)MatchResultType.Accepted)
                .GroupBy(x => new { x.BuyerId, x.AppliedOn })
                .Select(x => new FundedCount(
                    x.Key.BuyerId,
                    x.Count() / 30 * daysInMonth))
                .ToList();
        }
    }

FundedCount 不是 EF 实体,MatchHistory 是,所以无法理解它为什么会提示。

感谢所有建议。

最佳答案

它提示的原因是因为它不知道如何将您的 Select() 翻译成 SQL 表达式。如果您需要对不是实体的POCO进行数据转换,您应该先从EF获取相关数据,然后将其转换为POCO。

在您的情况下,它应该像之前调用 ToList() 一样简单:

return r.Find()
        .Where(x => x.AppliedOn >= day1 && x.AppliedOn <= day31 &&
                    x.ResultTypeId == (int)MatchResultType.Accepted)
        .GroupBy(x => new { x.BuyerId, x.AppliedOn })
        .ToList() // this causes the query to execute
        .Select(x => new FundedCount(x.Key.BuyerId, x.Count() / 30 * daysInMonth));

但是要小心,并确保尽可能地限制 ToList() 返回的数据集的大小,这样您就不会试图加载一个整个表到内存中。

关于c# - LINQ to Entities 消息中仅支持无参数构造函数和初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17367649/

相关文章:

c# - 调试器监 window 口中的 VS2015 LINQ

c# - 为什么我不能让这些扩展工作?

跨网络查询时,MySql 5 和 LINQ to Entities EF 4 导致 "Object must implement IConvertible"

c# - WPF/C# 中的线程和集合修改

c# - wma压缩音频文件使用Naudio抛出错误

c# - 碰撞中的Unity2D AudioSource

Linq Distinct 列表

c# - 使用哪个 linq 在当前集合中的集合中进行集合搜索

c# - 使用 LINQ 聚合对象

c# - DefaultIfEmpty() 导致 "System.NotSupportedException: LINQ to Entities does not recognize the method ' System.Collections.Generic.IEnumerable'”