2009-10-27 90 views
1

爲什麼這個東西在第二行行(即列表轉換)給出消息?Linq類型轉換問題

IEnumerable<Order> MyQuery = from order in dataContext.GetTable<Order>() 
          where order.ID == 1 
          select new Order() {ID = order.ID, OrderDate=order.OrderDate }; 

      List<Order> list = new List<Order>(MyQuery); 

消息:

Explicit construction of entity type 'Order' in query is not allowed. 

如果它已經轉換成一個IEnumerable。將它轉換爲List的問題是什麼?

再次,如果我寫的下面,它的工作原理:

IEnumerable<Order> MyQuery = from order in dataContext.GetTable<Order>() 
             where order.ID == 1 
             select order; 
List<Order> list = new List<Order>(MyQuery); 

爲什麼?有什麼竅門?

回答

3

問題並不在列表建設,這是在這一行:

select new Order() {ID = order.ID, OrderDate=order.OrderDate }; 

的問題是,你不能明確創建一個查詢中的一個實體。當您嘗試創建列表時,會發生這種情況,因爲IEnumerable實際上並未枚舉,直到您嘗試在new List<Order>行中將其包含,因爲延遲執行查詢。

它看起來像你試圖自己檢索訂單。答案很可能是剛剛選擇的順序,而不是試圖建立一個新秩序:

IEnumerable<Order> MyQuery = from order in dataContext.GetTable<Order>() 
         where order.ID == 1 
         select order; 

而且,沒有理由讓枚舉,然後把它變成一個列表。你可以這樣做:

List<Order> list = (from order in dataContext.GetTable<Order>() 
         where order.ID == 1 
         select order).ToList(); 
+0

假設數據是String對象而不是Order。我想我的列表是uint類型(將字符串對象轉換爲uint)。這可以一步完成嗎? – g33kz0r 2011-11-27 13:19:37

+0

@ G33kx0r它可能需要一個'。AsEnumerable()。Select(i => UInt32.Parse(i));'在查詢結束時,因爲您的提供者可能無法直接執行此操作。 – 2011-11-27 17:56:07

2

嗯,你只是真的在你將它轉換爲列表時執行查詢。在此之前,它只是一個任意的IQueryable

兩個選項(假設你要避免獲取所有其他列):

  1. 使用匿名類型:

    var query = from order in dataContext.GetTable<Order>() 
          where order.ID == 1 
          select {ID = order.ID, OrderDate=order.OrderDate }; 
    
    var list = query.ToList(); 
    
  2. 使用AsEnumerable創建新訂單後他們已經從LINQ提供商那裏下來了。需要注意的是他們不會在這一點上是正確的實體:

    var query = dataContext.GetTable<Order>() 
            .Where(order => order.ID == 1) 
            .AsEnumerable() // Do everything else "in process" 
            .Select(order => new Order {ID = order.ID, 
                   OrderDate=order.OrderDate }); 
    
    List<Order> list = query.ToList(); 
    
+0

喬恩:在你的選項1中,它可能不會編譯,因爲你試圖從IEnumerable 構造一個列表,對吧? – 2009-10-27 16:04:58

+0

糟糕,將修復使用var(這就是我的意思:) – 2009-10-27 16:08:40

+0

我會對連接環境中斷開連接的對象保持警惕。 – leppie 2009-10-27 16:14:55

2

第一個答案this post說明發生了什麼事情。

實體的使用模式是它們在查詢之外創建,並通過DataContext插入到表中,然後通過查詢從查詢​​中檢索,而不是通過查詢創建。

想一想,您可以使用.ToList()方法轉換爲列表。