2010-07-16 4 views
2

여러 개의 매개 변수를 사용하여 사용자가 아무것도 지정하지 않아도되는 긴 LinqtoSQl 쿼리가 있습니다. 오히려 매개 변수 문자열의 길이가> 0인지 또는 int> 0인지를 테스트하는 Select Case 문을 사용하기 시작했습니다.하지만 각 가능성을 테스트하고 각 쿼리를 기반으로 쿼리를 작성해야한다는 것을 깨달았습니다.LINQTOSql 매개 변수 질문이 누락되었습니다.

일부 검색을 수행하여 게시물에 응답하는 사람이 쿼리 사용 부분을 부정한다고 말한 게시물을 검색했습니다. || 좀 더 검색을 한 후에 (그리고 조건이 거의없는 C# 기술을 사용하여 실현 함), 도움이 안된다는 것을 깨달았습니다. 나는 내가하고 싶은 것을 생각

내가이를 통해 내 길을 IfElse'ing보다 더 좋은 방법이 있어야한다 KNW

Dim r = From x in db.List _ 
     (if firstName.Length < 1 then ignore query 
     else)where x.firstName = firstName _ 
     (if lastName.Length < 1 then ignore query 
     else)where x.LastName = lastName _ 
     Select x 

같은 ... 나는 몇 가지 펑키 물건을 할 것을 대략이다 StringBuilder 내,하지만 난 즉, 그것은 "화재"것 확실하지 않다 :

Dim sb as New StringBuilder 
sb.Append("Dim r = From x in db.List _") 
If firstName.Length < 1 then 
    sb.Append("Where x.firstName = firstName") 

ughh ... 더 나은 방법이 말해 당신의 도움에 대한

감사하십시오!

답변

2

쿼리를 작성할 수 있다는 사실을 사용하십시오. 이 코드는 C#에서 시작하여 작성한 다음 필요할 경우 나중에 VB로 변환합니다. 원칙은 동일합니다.

IQueryable<YourEntityType> query = db.List; 
if (firstName != "") 
{ 
    query = query.Where(x => x.firstName == firstName) 
} 
if (lastName != "") 
{ 
    query = query.Where(x => x.lastName == lastName) 
} 

이제는 query에서 올바르게 읽습니다. ("이 문자열은 빈 문자열입니다."보다 "이 문자열의 길이가 0보다 큰 것"을 이해하기가 더 간단하기 때문에 문자열 조건의 특성을 변경했습니다. 두 가지 모두 분명히 작동합니다.)

쿼리 식에서 이런 종류의 조건부 호출을 수행 할 수는 없지만 확장 메서드를 명시 적으로 호출 할 때는 쉽습니다.

+0

나는 내가 목록 (된 IQueryable로 희미한 쿼리를 시도 ... 나는이 아이디어 만 좋아 ... 난 당신이 날 위해 번역해야 할 것 같아요) = db.List query.Where (x => x.firstName == firstName) 하지만 intellesense는 다른 것을 입력하려고하는 견과를 찾은 다음 x가 선언되지 않은 경고 및 오류를받습니다. 감사합니다! – wali

+0

그냥 알아 냈어 ... query.Where (Function (x) x.firstName = firstName) 바보 같은 VB !!! 감사합니다. – wali

0

방법에 대한 ...

Dim r = From x in db.List _ 
     where (x.firstName = firstName Or firstName = "") _ 
     And (x.LastName = lastName Or lastName = "") _ 
     Select x 
+0

firstname 및 lastName 필드는 null이 아니므로 firstName = ""은 true를 반환하지 않습니다. ... 사용자가 검색 중에 이름을 지정하지 않게하는 것입니다 ... 감사! – wali

관련 문제