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サーバー上のどこで実行するようにクエリを強制することはできますか?
私はあなたが.Contains()を使いたいとは思わない。 .Any()を使用してください。 – Chad
あなたは 'AsEnumerable()'を行っているので、それ以降はすべてメモリ上で起こります(SQLには慣れていないが、一般的にはこのように動作します。どうしてそんなことをするのか? – Evk
これは、補完する必要のあるカスタムデータ型に、辞書やリストが含まれているために、AsEnumerable()以外のエラーが発生するためです。 リストまたは辞書なしで新しい匿名型を返すようにクエリを変更した後、AsEnumerable()を呼び出して、select(x => x = new customDataStructure {})を実行し、contains inをwhere in句として実行し、私のニーズに応えます。 – user2603293