質問

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);

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

役に立ちましたか?

解決

問題はリストの構成にあるのではなく、次の行にあります:

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();

他のヒント

この投稿は何が起こっているかを示しています。

  

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

検討すると、.ToList()メソッドを使用してリストに変換できます。

まあ、実際にクエリを実行するのはリストに変換するときだけです。それ以前は、任意の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. 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();
    
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top