1

このメッセージが2行目に表示されるのはなぜですか (つまり、リストの変換)?

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 に変換されている場合。それをリストに変換する問題は何ですか?

繰り返しますが、次のように書くとうまくいきます。

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

なんで?トリックは何ですか?

4

3 に答える 3

3

問題はリストの構築ではなく、次の行にあります。

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

問題は、クエリ内でエンティティを明示的に作成できないことです。これは、リストを作成しようとすると発生します。これはnew List<Order>、クエリの遅延実行により、IEnumerable が実際には行にラップされるまで列挙されないためです。

注文自体を取得しようとしているようです。答えは、おそらく注文を選択することであり、新しい注文を作成しようとしないことです。

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();
于 2009-10-27T16:00:19.973 に答える
2

実際にクエリを実行しているのは、クエリをリストに変換するときだけです。その前は、単なる任意のIQueryable.

2 つのオプション (他のすべての列のフェッチを回避しようとしていると仮定します):

  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. LINQ プロバイダーから降りたAsEnumerableに新しい注文を作成するために使用します。この時点では適切なエンティティではないことに注意してください。

    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();
    
于 2009-10-27T16:02:07.927 に答える
2

この投稿への最初の回答は、何が起こっているかを示しています。

エンティティの使用パターンは、クエリの外部で作成され、DataContext を介してテーブルに挿入され、後でクエリを介して取得され、クエリによって作成されることはありません。

.ToList() メソッドを使用してリストに変換できることを考慮してください。

于 2009-10-27T16:02:26.820 に答える