상황 : 나는 List<IQueryable<MyDataStructure>>
입니다. 나는 각각에 대한 단일 linq 쿼리를 병렬로 실행 한 다음 결과를 조인하려고합니다.병렬로 여러 IQueryable에서 동일한 linq 쿼리를 실행 하시겠습니까?
질문 : 매개 변수로 전달할 수있는 linq 쿼리를 만드는 방법은 무엇입니까?
예제 코드 :
는 여기에 몇 가지 간단한 코드입니다. 내가 편지 'H'로 시작하는 모든 단어를 찾을 싶습니다
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;
}
: 첫째, IQueryable<string>
의 컬렉션이 있습니다. 하나의 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);
하지만 어떻게해야합니까? 어떤 아이디어?
이것은 흥미 롭습니다.하지만이 질문과 쿼리 사용에 대한 일반적인 생각은 ** 평가/구문 분석/처리 될 표현 트리를 구축/생성하여 공급자에 대한 호출을 줄이는 것이 었습니다. 당신이 on/against를 실행하고있는 provider; 그런 식으로 공급자는 그 (아마도 복잡한) 표현을 취할 수 있고 그것이 가장 최적이라고 결정하는 어떤 방식 으로든 한 번 실행 할 수 있습니다.이 코드 샘플은이를 수행합니까? –
@BrettCaswell OP 코드는 모두 LINQ to Objects이며 메모리에서 처리되므로 문제가되지 않습니다. 이것은 메모리에서 작동하지만 - 그렇게 처리하지는 않습니다. –
답장을 보내 주셔서 감사합니다. 당신이 맞다고 생각합니다. SQL, Entity 또는 Object인지 여부에 관계없이 생각했습니다. 밑줄 개념은 여전히 표현식 트리를 작성하는 것입니다. PredicateBuilders와 LINQkit을 살펴 봤는데, 그것은 ExpressionExpression을 생성하기 위해 InvocationExpressions (invoke)를 사용하는 Expression.Lambda을 생성하는 것처럼 보입니다. EntitySet 확장 메소드로 약간의 속임수가 있습니다. –