猿问

仅支持初始值设定项,实体成员和实体导航属性

仅支持初始值设定项,实体成员和实体导航属性

我得到了这个例外:

LINQ to Entities不支持指定的类型成员'付费'。仅支持初始值设定项,实体成员和实体导航属性。

    public ActionResult Index()
    {
        var debts = storeDB.Orders
            .Where(o => o.Paid == false)
            .OrderByDescending(o => o.DateCreated);

        return View(debts);
    }

我的Model类

public partial class Order{
    public bool Paid {
        get {
            return TotalPaid >= Total;
        }
    }

    public decimal TotalPaid {
        get {
            return Payments.Sum(p => p.Amount);
        }
    }

付款是一个包含字段数量的相关表格,如果我删除Where子句显示有关付款的正确信息,查询有效,任何线索有什么问题?

解决了如下建议的答案:

    public ActionResult Index()
    {
        var debts = storeDB.Orders
            .OrderByDescending(o => o.DateCreated)
            .ToList()
            .Where(o => o.Paid == false);

        return View(debts);
    }


眼眸繁星
浏览 844回答 3
3回答

紫衣仙女

实体正在尝试将您的Paid属性转换为SQL,但不能,因为它不是表模式的一部分。你可以做的是让实体查询表没有付费过滤器,然后过滤掉非付费过滤器。public ActionResult Index(){     var debts = storeDB.Orders         //.Where(o => o.Paid == false)         .OrderByDescending(o => o.DateCreated);     debts = debts.Where(o => o.Paid == false);     return View(debts);}当然,这意味着您将所有数据带回Web服务器并过滤其上的数据。如果要在数据库服务器上进行筛选,可以在表上创建计算列或使用存储过程。

BIG阳

只是不得不解决类似的问题。上述解决方案需要内存处理,这是一种不好的做法(延迟加载)。我的解决方案是编写一个返回谓词的帮助器:public&nbsp;static&nbsp;class&nbsp;Extensions{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;Expression<Func<Order,&nbsp;bool>>&nbsp;IsPaid() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;order&nbsp;=>&nbsp;order.Payments.Sum(p&nbsp;=>&nbsp;p.Amount)&nbsp;>=&nbsp;order.Total; &nbsp;&nbsp;&nbsp;&nbsp;}}您可以将linq语句重写为:var&nbsp;debts&nbsp;=&nbsp;storeDB.Orders &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Where(Extensions.IsPaid()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.OrderByDescending(o&nbsp;=>&nbsp;o.DateCreated);当您想重用计算逻辑(DRY)时,这很方便。缺点是逻辑不在您的域模型中。

qq_笑_17

Linq将语句转换为SQL语句并将其执行到数据库中。现在,此转换仅适用于实体成员,初始值设定项和实体导航属性。因此,要实现函数或获取属性比较,我们需要先将它们转换为内存列表,然后应用函数来检索数据。因此,总的来说,var&nbsp;debts&nbsp;=&nbsp;storeDB.Orders.toList() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Where(o&nbsp;=>&nbsp;o.Paid&nbsp;==&nbsp;false) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.OrderByDescending(o&nbsp;=>&nbsp;o.DateCreated);
随时随地看视频慕课网APP
我要回答