2014年2月18日 星期二

ASP.NET MVC 4 WebApi 遇到 「LINQ to Entities 無法辨識方法 '函式名稱(Function_Name)' 方法,而且這個方法無法轉譯成存放區運算式 」 解決方法

在做資料讀取時,有 CustomerID 要撈出所有訂購的項目,所以要使用 CustomerID 篩選出 Orders 資料後再去與 Order Details 做篩選,最後就會找出所有訂購產品的項目,資料表關聯如下:


接著在 Controller 這樣使用:
List<Orders> orders = db.Orders
    .Where(x => x.Customers.CustomerID == id)
    .ToList();

List<Order_Details> order_details = db.Order_Details
    .Include(x => x.Orders)
    .Include(x => x.Products)
    .Where(x => orders.Exists(p => x.Orders.OrderID == p.OrderID))
    .ToList();

就會發生「LINQ to Entities 無法辨識方法 'Boolean Exists(System.Predicate`1[MVVMwithExtjs.Models.Orders])' 方法,而且這個方法無法轉譯成存放區運算式。

後來發現,LINQ to SQL 時無法產生相同的 function,除非你在 SQL Server 上建立相同的預存程序,但是 Where 內又必須使用 LINQ Expression 篩選,可以參考 當EF LINQ Expression遇上Methods如何於LINQ to Entities中使用SQL Server的使用者自訂函數,可能可以解決這個問題,但是都頗麻煩的,所以後來把這資料先實例化出來再做篩選:
List<Orders> orders = db.Orders
    .Where(x => x.Customers.CustomerID == id)
    .ToList();

List<Order_Details> order_details = db.Order_Details
    .Include(x => x.Orders)
    .Include(x => x.Products)
    .ToList()
    .Where(x => orders.Exists(p => x.Orders.OrderID == p.OrderID))
    .ToList();


沒有留言 :

張貼留言

Related Posts Plugin for WordPress, Blogger...