天天看點

LINQ to Entities 查詢注意事項

1> 排序資訊丢失

如果在排序操作之後執行了任何其他操作,則不能保證這些附加操作中會保留排序結果。這些操作包括 Select 和 Where 等。另外,采用表達式作為輸入參數的 First 和 FirstOrDefault 方法不保留順序。

如下代碼:并不能達到反序排序的效果

LINQ to Entities 查詢注意事項

using (var edm = new NorthwindEntities())
{
     IQueryable<Customers> cc = edm.Customers.OrderByDescending(c => c.CustomerID).Where(c => c.Region != null).Select(c => c);     foreach (var c in cc)
          Console.WriteLine(c.CustomerID);
}      
LINQ to Entities 查詢注意事項

2> 不支援無符号整數

由于 實體架構不支援無符号整數,是以不支援在 LINQ to Entities 查詢中指定無符号整數類型。如果指定無符号整數,則在查詢表達式轉換過程中會引發 NotSupportedException異常,并顯示無法建立類型為“結束類型”的常量值。此上下文僅支援基元類型(“例如 Int32、String 和 Guid”)。

如下将會報異常的代碼:

LINQ to Entities 查詢注意事項
using (var edm = new NorthwindEntities())
 {      uint id = UInt32.Parse("123");
      IQueryable<string> produt = from p in edm.Products                                  where p.UnitPrice == id                                  select p.ProductName;      foreach (string name in produt)
            Console.WriteLine(name);
}      
LINQ to Entities 查詢注意事項

上面的代碼中,由于id是uint而不是Int32,String,Guid的标量類型,是以在執行到where p.UnitPrice ==id這個地方時,會報異常。

3> 不支援引用非标量閉包

不支援在查詢中引用非标量閉包(如實體)。在執行這類查詢時,會引發 NotSupportedException 異常,并顯示消息“無法建立類型為“結束類型”的常量值。此上下文中僅支援基元類型(‘如 Int32、String 和 Guid’)

LINQ to Entities 查詢注意事項
using (var edm = new NorthwindEntities())
 {
        Customers customer = edm.Customers.FirstOrDefault();
        IQueryable<string> cc = from c in edm.Customers                                where c == customer                                select c.ContactName;         foreach (string name in cc)
               Console.WriteLine(name);
}      

繼續閱讀