眼眸繁星
2019-08-27 16:48:16
僅支持初始值設(shè)定項,實體成員和實體導(dǎo)航屬性我得到了這個例外:LINQ to Entities不支持指定的類型成員'付費'。僅支持初始值設(shè)定項,實體成員和實體導(dǎo)航屬性。 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);
}
}付款是一個包含字段數(shù)量的相關(guān)表格,如果我刪除Where子句顯示有關(guān)付款的正確信息,查詢有效,任何線索有什么問題?解決了如下建議的答案: public ActionResult Index()
{
var debts = storeDB.Orders
.OrderByDescending(o => o.DateCreated)
.ToList()
.Where(o => o.Paid == false);
return View(debts);
}
3 回答

紫衣仙女
TA貢獻1839條經(jīng)驗 獲得超15個贊
實體正在嘗試將您的Paid屬性轉(zhuǎn)換為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);}
當然,這意味著您將所有數(shù)據(jù)帶回Web服務(wù)器并過濾其上的數(shù)據(jù)。如果要在數(shù)據(jù)庫服務(wù)器上進行篩選,可以在表上創(chuàng)建計算列或使用存儲過程。

BIG陽
TA貢獻1859條經(jīng)驗 獲得超6個贊
只是不得不解決類似的問題。上述解決方案需要內(nèi)存處理,這是一種不好的做法(延遲加載)。
我的解決方案是編寫一個返回謂詞的幫助器:
public static class Extensions{ public static Expression<Func<Order, bool>> IsPaid() { return order => order.Payments.Sum(p => p.Amount) >= order.Total; }}
您可以將linq語句重寫為:
var debts = storeDB.Orders .Where(Extensions.IsPaid()) .OrderByDescending(o => o.DateCreated);
當您想重用計算邏輯(DRY)時,這很方便。缺點是邏輯不在您的域模型中。

qq_笑_17
TA貢獻1818條經(jīng)驗 獲得超7個贊
Linq將語句轉(zhuǎn)換為SQL語句并將其執(zhí)行到數(shù)據(jù)庫中。
現(xiàn)在,此轉(zhuǎn)換僅適用于實體成員,初始值設(shè)定項和實體導(dǎo)航屬性。因此,要實現(xiàn)函數(shù)或獲取屬性比較,我們需要先將它們轉(zhuǎn)換為內(nèi)存列表,然后應(yīng)用函數(shù)來檢索數(shù)據(jù)。
因此,總的來說,
var debts = storeDB.Orders.toList() .Where(o => o.Paid == false) .OrderByDescending(o => o.DateCreated);
添加回答
舉報
0/150
提交
取消