情况:我有一个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>
对象并行运行相同的查询,然后合并结果。这是一种方法:
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);
但我不知道如何做到这一点。有任何想法吗?