2017-05-11 8 views
0

Linq to SQLクエリで使用されている行IDのリストがあります。いくつかの場合においてどのようにしてLinqにSQLのWhere句を強制的に入れるのですか?

using (var db = new DataContext(dbConnectionString)) 
{ 
    ids = new list<long> {"1","2",...}; 
    var data = (from item in db.GetTable<dataTable>().AsEnumerable() 
       where ids.Contains(item.ID) 
       select new customDataStructure{}).ToList(); 
} 

、それは「ID(@ P0、@ P1、...)の」形式のパラメータとしてSQLにリスト中のIDの各々を通過します。それ以外の場合、クエリはすべてのレコードを取得し、c#でフィルタを実行させます。これは、メモリ使用量と可能なメモリ例外の巨大なスパイクを引き起こすので、取り出されるデータ量が非常に大きくなります。

この問題を回避するために、SQLサーバー上のどこで実行するようにクエリを強制することはできますか?

+0

私はあなたが.Contains()を使いたいとは思わない。 .Any()を使用してください。 – Chad

+0

あなたは 'AsEnumerable()'を行っているので、それ以降はすべてメモリ上で起こります(SQLには慣れていないが、一般的にはこのように動作します。どうしてそんなことをするのか? – Evk

+0

これは、補完する必要のあるカスタムデータ型に、辞書やリストが含まれているために、AsEnumerable()以外のエラーが発生するためです。 リストまたは辞書なしで新しい匿名型を返すようにクエリを変更した後、AsEnumerable()を呼び出して、select(x => x = new customDataStructure {})を実行し、contains inをwhere in句として実行し、私のニーズに応えます。 – user2603293

答えて

1

EvEがコメントしたように、AsEnumerable()は、SQLサーバーではなくローカルで実行される場所を引き起こしました。

IQueryableでビルドしようとすると例外が発生する、返される型のリストと辞書が必要だったので、使用されていました。

私はそれはデータ収集がSQLで行われ、その後、SQLの実行後に完了に必要な構造を持っていること聞かせ

using (var db = new DataContext(dbConnectionString)) 
{ 
    ids = new list<long> {"1","2",...}; 
    var data = (from item in db.GetTable<dataTable>() 
       where ids.Contains(item.ID) 
       select new 
       { 
        name = item.name, 
        subIds = item.subitemIDs 
        ... 
       }).AsEnumerable() 
       .Select(x=> new customDataStructure 
        { 
         itemname = x.name, 
         subIds = x.subIds.ToList(), 
         ... 
        }).ToList(); 
} 

にクエリを変更。

+0

これは有効な方法です。 – Evk

0

.Contains()を使用することは、あなたが使いたいと思うものではありません。私はあなたのリスト内の項目のいずれかがテーブルのプロパティまたは列と一致するかどうかを確認する.Any()を使いたいと思う。以下を参照してください:

var ids = new List<long> {1,2}; 
var data = (from item in db.GetTable<dataTable>().AsEnumerable() 
where ids.Any(m=> m == item.Property) 
select new customDataStructure{}).ToList(); 
+0

Any()に切り替えると、SQL Server上ではなくデータが取得された後でもコード内でフィルタリングが行われます。 – user2603293

関連する問題