不能在LINQ到实体查询中构造实体或复杂类型;在控制器

本文关键字:实体 复杂 类型 控制器 LINQ 查询 不能 | 更新日期: 2023-09-27 18:07:20

我有这个代码在我的控制器

IQueryable<SellingItem> sellingitems = db.SellingItems
            .GroupBy(s => new { s.ItemId ,s.Condition,s.ExpInDays})
            .Select(si => new SellingItem
            {
                Item = si.First().Item,
                Condition = si.First().Condition,
                ExpInDays = si.First().ExpInDays,
                Qty = si.Sum(i => i.Qty),
            });

,当我试图运行它时,我得到一个错误

不能在LINQ to Entities查询中构造实体或复杂类型

现在看来,我的linq查询太复杂,实体框架无法处理,

所以我有两个变通办法,但我不是都喜欢。

1。将整个表加载到内存中,并执行如下查询

2。使用SQL语句,这样会更快,但不会遵循实体框架规则

有更好的方法吗?

——更新 ---------------------------------

事实证明(谢谢大家)

写错了

现在看来,我的linq查询太复杂,实体框架无法处理,

不起作用,因为我对结果使用了相同的类。我创建了一个新的类,现在它工作惊人!!

不能在LINQ到实体查询中构造实体或复杂类型;在控制器

您不需要使用任何变通方法来修复异常本身。问题是,SellingItem是一个类,是你的实体框架模型的一部分。原因在这个答案的评论中解释了。

选择匿名对象,如下所示:

IQueryable<SellingItem> sellingitems = db.SellingItems
.GroupBy(s => new { s.ItemId ,s.Condition,s.ExpInDays})
.Select(si => new
{
    Item = si.First().Item,
    Condition = si.First().Condition,
    ExpInDays = si.First().ExpInDays,
    Qty = si.Sum(i => i.Qty),
});

或者为要执行的选择创建一个对象:

public class NewClass
{
    public ItemClass Item { get;set; }
    public ConditionClass Condition { get;set; }
    public in ExpInDays { get;set; }
    public int Qty { get;set; }
}

当然,您需要确保这个特定类中的类型与它们各自的类型匹配。

然后可以使用新类来执行select:

 // Use new class
 IQueryable<SellingItem> sellingitems = db.SellingItems
.GroupBy(s => new { s.ItemId ,s.Condition,s.ExpInDays})
.Select(si => new NewClass
{
    Item = si.First().Item,
    Condition = si.First().Condition,
    ExpInDays = si.First().ExpInDays,
    Qty = si.Sum(i => i.Qty),
});