다음은 대략 수행하려는 작업의 대략적이고 간단한 코드 예제이며 예상대로 작동하지 않습니다. 나는 문제의 경우 Entity에 Linq를 사용하고 있습니다.Linq 루프에서 Where 절을 추가하는 데 도움이 필요합니다.
두 개의 날짜 절이있는 경우 기본적으로 DateClause의 끝에서 아무 것도 반환하지 않는 첫 번째 루프에서 하나의 날짜 절이 매우 효과적입니다. TextClause의 루프에서는 첫 번째 텍스트 절 이후에 모든 텍스트 절을 무시하는 것으로 보입니다.
내 절약 조항은 ANDed가 될 것이므로 텍스트 절을 작성한 다음 다른 절을 추가하면 추가해야하며 특히 Contains 메서드를 사용하면 더욱 집중된 결과를 얻을 수 있습니다.
날짜에 대한 기대치는이 날짜 범위를 수행 할 것으로 예상되지만, 두 날짜가있는 경우 범위에 올바른 날짜가있는 레코드가 있음에도 불구하고 항상 아무 것도 반환하지 않습니다.
나는 틀린 무엇인가 잘못하고있는 것을 확신한다. 그러나 나는 그것을 볼 수 없다.
enum Operators
{
Contains,
DoesNotContain,
GreaterThan,
LessThan
}
public void DoSomething(List<DateClauses> dateClauses, List<TextClauses> textClauses)
{
var query = from t in context.Table
where t.Enabled = true
select new
{
title = t.title
date = t.date
}
foreach (DateClause clause in dateClauses)
{
switch (clause.Operator)
{
case Operator.GreaterThan:
query = query.Where(l => l.date > clause.Date);
break;
case Operator.LessThan
query = query.Where(l => l.date < clause.Date);
break;
}
}
foreach (TextClause clause in textClauses)
{
switch (clause.Operator)
{
case Operator.Contains:
query = query.Where(l => l.title.Contains(clause.Text));
break;
case Operator.DoesNotContain
query = query.Where(l => !l.title.Contains(clause.Text));
break;
}
}
}
EDIT : 프로세스에서 enum 사용을 보여주기 위해 업데이트 된 예제 코드. 열거 형의 사용법을 보잘것없는 해결책으로 풀었을 때, Joel의 응답에 나와있는 코멘트에 예외가 생겼습니다.
나는 지금까지 내가 응답 한 것을 좋아하고 몇 가지 새로운 Linq 트릭을 배웠다. 나는 bool과 enum이 Linq와 많은 관련이 있다고 생각하지 않았기 때문에 예제를 사과했다. 변경 사항이 저에게 효과가있는 해결책을 찾는 데 도움이되기를 바랍니다. 지금까지 큰 반향을 보내 주셔서 다시 한번 감사드립니다.
마찬가지로, 나는 이것이 효과가있을 것이라고 기대했을 것입니다. 추적을 설정하고 결과 쿼리가 어떻게 표시되는지 확인하는 것이 좋습니다. 물론 이것은 실제 코드가 아니기 때문에 다른 곳에서 잘못된 것이있을 수 있습니다. –
.ToList()를 .Where()의 끝에 추가하십시오. – rmoore
@rmoore : ** Noooooooooo! ** 추가 중.ToList()는 여기서 도움이되지 않으며 필요없는 위치에 추가하면 성능에 좋지 않습니다. –