0

私は苦労して、これらの概念に頭を悩ませようとしてきました。どんな助けでも大歓迎です。1 つのテーブルに Orders のコレクションがある場合、それを繰り返し処理し、他のテーブルに対してクエリを実行する最良の方法は何ですか。

このループは私が望んでいることを実行しますが、これがどのようにパフォーマンスの問題を引き起こすかを教えてもらいました。他の投稿で、ループの外側でデータベースを照会するのが最適な場所を読みました。

foreach (var item in myOrders)
{
var lookUpValues=(from f in ORDERS
where f.ORDERS ==item.ORDER_ID 
&& f.ORDERS_SUFFIX==item.LINE
select f.Something);
}

反復する前に Order テーブル全体をプルダウンするのではなく、次のようなことを試しましたが、ご覧のとおり、正確な行が返されません。

var orderIds=myOrders.Select (x =>x.ORDER_ID).Distinct().ToList();
var lineIds=myOrders.Select (x =>x.LINE).Distinct().ToList();

var query=(from f in ORDERS
where orderIds.Contains(f.ORDERS)
&& lineIds.Contains(f.ORDERS_SUFFIX)
select f).ToList();

以下は、私が必要だと思うことを行います。反復処理が必要な正しい Orders が返されます。ただし、メモリオブジェクトとエンティティを一緒にクエリできないため、エラーがスローされます。

var ordersAndLine=(from f in myOrders select new{sId=f.ORDER_ID,line=f.LINE}).ToList();

var query=(from f in ORDERS
from s in ordersAndLine
where s.sId==f.ORDERS
&& s.line==f.ORDERS_SUFFIX
select f).ToList();

NotSupportedException: '匿名型' の定数値を作成できません。このコンテキストでは、プリミティブ型 (Int32、String、および Guid など) のみがサポートされます。

私の質問が理にかなっていることを本当に願っています。状況を正しく説明していない場合は、事前にお詫び申し上げます。私が行っていることは、テーブルの大部分をメモリに引き下げて反復処理を行うことですが、これがパフォーマンスの問題を引き起こすのではないかと心配しており、結果のクエリをフィルター処理するより良い方法があるかどうかを確認したいと考えていました。

4

3 に答える 3

1

最初の試行と最後の試行を組み合わせると、それが得られます。匿名型を作成していない場合は、最後の試行で問題ありません。

var ordersAndLine=(from f in myOrders select f).ToList();

var query=(from f in ORDERS
from s in ordersAndLine
where s.ORDER_ID==f.ORDERS
&& s.LINE==f.ORDERS_SUFFIX
select f).ToList();
于 2012-05-24T04:52:59.707 に答える
0

これを試して:

var orders = myOrders.SelectMany(item => (from f in ORDERS
                                          where f.ORDERS ==item.ORDER_ID 
                                          && f.ORDERS_SUFFIX==item.LINE
                                          select f.Something));
于 2012-05-24T01:55:49.680 に答える
0

これらを見てください:

http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/095745fe-dcf0-4142-b684-b7e4a1ab59f0/

Linq to Entities - SQL "IN" 句

于 2012-05-23T22:36:11.273 に答える