2017-12-07 6 views
0

以下のコードは機能しますが、現在最適化しているかどうかを調べたり、ループごとに1回データベーステーブルがあり、これは永遠にかかると思われますLinqを使用してカスタムクラスの項目を検索する

カスタムクラステーブルとSQLテーブルは、同じ名前を持っています。 queryListは、カスタムクラスのリストです。

foreach (var item in queryList) 
{ 
    var query = context.DataTable.Where(i => i.ValueName == item.ValueName && i.Symbol == symbol && i.Days == item.Days).ToList(); 

    if (query.Count() > 0) 
    { 
     context.DataTable.RemoveRange(query); 
    } 
} 

答えて

0

あなたqueryListが巨大なリストではない場合、これは動作可能性があります

私はsymbolitem.Symbol実際べきであると仮定します。その場合は、これを試してみてください。

var items = queryList 
    .Select(item => item.ValueName + "," + item.Symbol + "," + item.Days.ToString()) 
    .ToList(); 
var query = context.DataTable 
    .Where(i => items.Contains(i.ValueName + "," + i.Symbol + "," + i.Days.ToString()); 

アイデアは、SQLにLINQはWHERE x IN (str1, str2, str3)句に変換できる文字列のリストを構築することです。

+0

私は予期せぬ$文字エラーを取得しています私はこのコードを実行できません – user3610374

+0

@ user3610374、私は文字列補間を使用しないようにコードを変更しました。 –

1

あなたはWherequeryListのメンバーをテストすることができます。

var query = context.DataTable.Where(i => i.Symbol == symbol && queryList.Any(item => i.ValueName == item.ValueName && i.Days == item.Days)).ToList(); 
+0

実行しようとすると、私はあなたのコード行でこのエラーを受け取ります。 MultipleRegressionInfoはカスタムクラスの名前です。btw 'AdminClient.MultipleRegressionInfo'タイプの定数を作成できません。このコンテキストでは、プリミティブ型または列挙型のみがサポートされています。 – user3610374

+0

おそらく、あなたの質問をいくつかのデータ型で更新し、 'AdminClient'と' MultipleRegressionInfo'がどこに適用されるのでしょうか。 – NetMage

0

あなたは、データベースへの1回の旅行ですべてのデータをフェッチするためにUnionを使用することができます。

var query = context.DataTable.Where(x => x.Id == 0); 
foreach (var item in queryList) 
    query = query.Union(context.DataTable.Where(i => i.ValueName == item.ValueName && i.Symbol == symbol && i.Days == item.Days)); 

var allData = query.ToList(); 
if (allData.Count() > 0) 
    context.DataTable.RemoveRange(allData); 
関連する問題