状況:を持っていList<IQueryable<MyDataStructure>>
ます。それぞれに対して単一のlinqクエリを並行して実行し、結果を結合したいと考えています。
質問:パラメータとして渡すことができる linq クエリを作成するにはどうすればよいですか?
コード例:
ここにいくつかの単純化されたコードがあります。まず、次のコレクションがありIQueryable<string>
ます。
public List<IQueryable<string>> GetQueries()
{
var set1 = (new List<string> { "hello", "hey" }).AsQueryable();
var set2 = (new List<string> { "cat", "dog", "house" }).AsQueryable();
var set3 = (new List<string> { "cat", "dog", "house" }).AsQueryable();
var set4 = (new List<string> { "hello", "hey" }).AsQueryable();
var sets = new List<IQueryable<string>> { set1, set2, set3, set4 };
return sets;
}
文字「h」で始まるすべての単語を検索したいと思います。単一のIQueryable<string>
場合、これは簡単です:
query.Where(x => x.StartsWith("h")).ToList()
IQueryable<string>
しかし、すべてのオブジェクトに対して同じクエリを並行して実行し、結果を結合したいと考えています。これを行う1つの方法は次のとおりです。
var result = new ConcurrentBag<string>();
Parallel.ForEach(queries, query =>
{
var partOfResult = query.Where(x => x.StartsWith("h")).ToList();
foreach (var word in partOfResult)
{
result.Add(word);
}
});
Console.WriteLine(result.Count);
しかし、私はこれをより一般的な解決策にしたいと考えています。linq 操作を個別に定義し、それをパラメーターとしてメソッドに渡すことができるようにします。このようなもの:
var query = Where(x => x.FirstName.StartsWith("d") && x.IsRemoved == false)
.Select(x => x.FirstName)
.OrderBy(x => x.FirstName);
var queries = GetQueries();
var result = Run(queries, query);
しかし、私はこれを行う方法に途方に暮れています。何か案は?