2009-09-30 2 views
7

문은 내가 빈 필요는 LINQ 쿼리에서 WHERE 절의 일부가 될 경우! 두 개의 텍스트 상자가있는 경우 사용하는 절. 여기 LINQ WHERE 전 C# .NET을</p> <p>을 사용하고

내가이 일 것이라고 생각
var result = from a in xxxx select a; 

if(!string.IsNullOrEmpty(personName)) 
{ 
    return result.Where(a >= a.forename.Contains(personName) || a.surname.Contains(personName)  
} 
else if(!string.IsNullOrEmpty(dateFrom)) 
{ 
    return result.Where(a >= a.appStartDateTime >= dateFrom.Date) 
} 
else if(!string.IsNullOrEmpty(personName) && !string.IsNullOrEmpty(dateFrom)) 
{ 
    return result.Where(a >= a.forename.Contains(personName) || a.surname.Contains(personName) && a.appStartDateTime >= dateFrom.Date); 
} 

내 코드하지만 어디에요 좋아하지 않는 나는 '는이'하지 않는다 '는'예를 들어 a.forename (이름에 액세스하지 못할 현재 컨텍스트에 존재)

무엇이 잘못 되었습니까, 아니면 실제로 할 수 없습니까?

미리 도움을 청하십시오. 대신이의 클레어

+1

마지막으로 else를 치지 않습니다. 마지막 else가 true이면 true가 true이면 true가됩니다. 그러므로 마지막에 도착할 수 없습니다. –

+0

이제 모든 if 문으로 변환했습니다. – ClareBear

+0

@ ClareBear 그들이 아직 return 문을 가지고 있다면 도움이되지 않습니다. 두 조건을 모두 검사하는 마지막 if 문을 절대 사용하지 않습니다. 당신은 여전히 ​​첫 번째 것에서 만 돌아올 것입니다. personName && dateFrom에 대한 검사가 null이 아니거나 비어 있지 않도록 먼저 다시 정렬합니다. –

답변

6

:

result.Where(a.forename.Contains(personName)) 

이 시도 :

result.Where(a => a.forename.Contains(personName)) 

당신은 람다 연산자 (=>)을 누락 된 것으로 나타납니다. 단 하나의 출구 지점

+0

내가 진실이라면 그 자체가 아닌 외부에 접근 할 수 없다는 if 문 안에 있기 때문에 읽은 것 같아요?"이름이 '현재 컨텍스트 오류에 존재하지 않습니다." – ClareBear

+0

업데이트 된 코드를 게시 할 수 있습니까? – RichardOD

+0

업데이트 된 코드로 내 질문을 업데이트했습니다. – ClareBear

1

.. 또는 :

var result = from a in xxxx select a; 

Func<string, bool> func = null; 

if(!string.IsNullOrEmpty(personName)) 
{ 
func = (a) => {a.forename.Contains(personName) || a.surname.Contains(personName)};  
} 

else if(!string.IsNullOrEmpty(dateFrom)) 
{ 
func = (a) => {a.appStartDateTime >= dateFrom.Date}; 
} 

else if(!string.IsNullOrEmpty(personName) && !string.IsNullOrEmpty(dateFrom)) 
{ 
func = (a) => {a.forename.Contains(personName) || a.surname.Contains(personName) && a.appStartDateTime >= dateFrom.Date;}; 
} 

return result.Where(func); 
2

당신이 날짜 시간을 파싱해야하므로이


var result = from a in xxxx select a 
    where (string.IsNullOrEmpty(personName) || a.forename.Contains(personName) 
      || a.surname.Contains(personName)) 
      && (string.IsNullOrEmpty(dateFrom) 
      || a.appStartDateTime >= DateTime.Parse(dateFrom).Date); 

dateFrom 문자열로 표시하려고합니다.

이 논리는 작동해야하지만 테스트하지 않았습니다. 내가 틀렸을 수도있다.

personName이 null 또는 비어 있지 않은 경우 forename 또는성에 personName이 포함되어 있는지주의해야합니다. 따라서 personName이 null이거나 비어 있거나 fore/sur 이름에 person name이 포함 된 경우이를 반환하도록 다시 작성할 수 있습니다. 이후 || 연산자가 단락되어 있는지 검사하지 않습니다. personName이 null이거나 비어 있으면 Contains를 포함합니다.

2

또한 읽을 수있는 조건을 결합 논리가 짧고 쉽게 만들 수 있습니다

var result = from a in xxxx select a; 

if (!string.IsNullOrEmpty(personName)) 
    result = result.Where(a => a.forename.Contains(personName) || a.surname.Contains(personName) 

if (!string.IsNullOrEmpty(dateFrom)) 
    result = result.Where(a >= a.appStartDateTime >= dateFrom.Date) 

return result; 

조건을 결합이 방법이 잘와 'AND'조건 작동합니다. 'OR'조건이 필요한 경우 조금 더 복잡해집니다. 고맙게도 Joe Albahari는 PredicateBuilder (LINQKit의 일부로)를 크게 지원합니다.

희망이 도움이됩니다.