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

dot*_*oob 29 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

FundedCount不是EF enity,MatchHistory是,所以无法理解它为什么抱怨.

所有建议都赞赏.

Yuc*_*uck 51

它抱怨的原因是因为它不知道如何将您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));
Run Code Online (Sandbox Code Playgroud)

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


Rap*_*aus 12

消息很明确:linq to entities不支持没有无参数ctor的对象.

所以

解决方法1

枚举之前(或使用中间匿名类型并枚举那个)

.ToList()
.Select(x => new FundedCount(
                    x.Key.BuyerId,
                    x.Count() / 30 * daysInMonth))
                .ToList();
Run Code Online (Sandbox Code Playgroud)

溶液2

将无参数ctor添加到您的FundedCount类(如果可能的话)

public FundedCount() {}
Run Code Online (Sandbox Code Playgroud)

并使用

.Select(x => new FundedCount{
                        <Property1> = x.Key.BuyerId,
                        <Property2> = x.Count() / 30 * daysInMonth
                         })
                    .ToList();
Run Code Online (Sandbox Code Playgroud)

  • 这个Solution2是最好的imo,因为没有中间的ToList(),因此也没有中间的SQL执行.谢谢! (2认同)