2

我有很多的問題,讓它發送到服務器檢索過濾的結果之前,正確構建查詢,我是查詢孔命令結果集然後appliying一個訂單商品過濾器與計算屬性,當試圖重構只獲取匹配項目條件的訂單的集合,當然我得到的錯誤:指定的類型成員'ReceivableQuantity'不支持LINQ to Entities。僅支持初始化程序,實體成員和實體導航屬性。 下面的工作代碼:改善Linq到實體查詢與未映射的屬性

pendingOrders = from o in this.GetAll() 
       where o.OrderItems.Where(i => i.ReceivableQuantity > 0).Count() > 0 
       select new Order() 
       { 
         OrderNumber = o.OrderNumber, 
         Comments = o.Comments, 
         FinalApprover = o.FinalApprover, 
         OrderDate = o.OrderDate, 
         Requisitioner = o.Requisitioner, 
         SupplierName = o.SupplierName, 
         ID = o.ID, 
         ShoppingCartName = o.ShoppingCartName, 
         OrderItems = (from i in o.OrderItems 
            where i.ReceivableQuantity > 0 
            select i).OrderBy(i => i.LineNumber).ToList() 
       }; 

這是NotMapped物業在OrderItem的類別:

[NotMapped] 
    public decimal ReceivableQuantity 
    { 
     get 
     { 
      if (Order == null) 
       return 0; 

      decimal response; 
      response = this.MatchedQuantity - this.ReceivedQuantity; 

      if (response >= 0) 
       return response; 
      else 
       throw new ArgumentOutOfRangeException("Receivable Quantity must be greater than 0."); 
     } 
    } 

MatchedQuantity和ReceivedQuantity也NotMapped屬性,所以我認爲這是真正的延伸。

什麼是我最好使用的方法,現在使用它的網站已經在運行,隨着數據庫日益增長,使用代碼的功能變得非常緩慢。

在此先感謝您的幫助。 Lio。

回答

0

我猜你正在使用代碼優先映射。這種方法在高級查詢方面非常有限,因爲它仍然不支持SQL函數映射。因爲你有這些選項:

  • 將所有未映射屬性的整個計算直接放到Linq-to-entities查詢中。這可以使你的查詢很討厭。
  • 擺脫該查詢並使用兩個存儲過程 - 1st獲取符合條件的所有訂單,其次獲取所有與您的條件相匹配的訂單的所有訂單項。您可以使用Database.SqlQuery來調用這些存儲過程。
  • 請勿使用EF並直接使用SQL執行查詢。在這種情況下,您甚至可以使用一個帶有兩個查詢的SQL命令和一個具有兩個查詢的存儲過程。
+0

感謝您的回覆Ladislav,我使用的是SQLCE,所以存儲過程不是解決方案,另一方面,我遠遠不擅長編寫T-SQL :),這就是爲什麼我選擇EF作爲數據訪問技術因爲比T-SQL更容易維護linq,在開始嘗試寫入SQL查詢之前,將繼續嘗試尋找解決方案 – Lio