2010-03-05 2 views
1

LINQ to SQL을 사용하고 있으며 사용자가 UI에서 queryStrings에 값을 할당하여 쿼리를 설정할 수 있도록 허용하고 있습니다. 기본 쿼리를 설정하여 IQueryable 결과를 반환 한 다음 결과로 생성되는 IQueryable 개체를 계속 사용하여 결과 집합을 정제합니다. 모든 것이 잘 작동하고 코드이LINQ to SQL - 포함하여 IQueryable 결과 집합을 추가로 수정

var result = (from record in db.Companies 
select new Company 
{ 
    Id = record.Id, 
    Name = record.Name, 
    City = record.City, 
    Status = record.Status 
}); 
if (queryName != null && queryName!= "") 
{ 
    result = result.Where(p => p.Name.Contains(queryName)); 
} 

if (queryCity != null && queryCity!= "") 
{ 
    result = result.Where(p => p.City.StartsWith(queryCity)); 
} 

과 유사은 지금은 쿼리를 확장 할 내 점점 SQL에서에 "절에"유사한 요소 세트를 일치. 예를 들어 검색어에 사용할 요소 목록이있는 경우

string[] queryStatusList = {"x", "y" }; 

이제이 코드를 작성하면 모든 것이 정상입니다.

var result = (from record in db.Companies 
where queryStatusList.Contains(record.status) 
    select new Company 
    { 
     Id = record.Id, 
     Name = record.Name, 
     City = record.City, 
     Status = record.Status 
    }); 
if (queryName != null && queryName!= "") 
{ 
    result = result.Where(p => p.Name.Contains(queryName)); 
} 

if (queryCity != null && queryCity!= "") 
{ 
    result = result.Where(p => p.City.StartsWith(queryCity)); 
} 

그러나 초기 쿼리에서 where 절을 사용하고 싶지 않습니다. 이전 예제에서와 같이 정제 된 쿼리 결과로 빌드하고 싶습니다. 내 질문은 어떻게 그런 쿼리를 구조 것입니다. 나는

if (queryStatusList != null && queryStatusList.Count() > 0) 
{ 
    result = result.Where(queryStatusList.Contains(result.Select(p => p.Status.ToString()))); 
} 

을 시도하지만 컴파일러 오류가 발생합니다 : "메소드의 형태 인수 'System.Linq.Enumerable.Contains (System.Collections.Generic.IEnumerable, TSource)는'사용에서 유추 할 수 없습니다. 명시 적으로 형식 인수를 지정하십시오. "몇 가지 변형을 시도했지만 문제를 해결하는 방법을 모르겠습니다.

한편
if (queryStatusList != null && queryStatusList.Count() > 0) 
{ 
    result = result.Where(r=> queryStatusList.Contains(r.Status)); 
} 

, 단일 절 선택을 구축하고 대신 사용하는 PredicateBuilder를 사용하여보고 할 수 있습니다 :

답변

1

은 당신이 약간 변경하면, 작동 할 수있다 생각합니다. PredicateBuilder를 사용하면 동적으로 빌드하면서 AND 및 OR 절이 혼합 된 복잡한 쿼리를 만드는 기능과 제어 기능을 더 많이 제어 할 수 있습니다.

var predicate = PredicateBuilder.True<Company>(); 

if (queryName != null && queryName!= "") 
{ 
    predicate = predicate.And(p => p.Name.Contains(queryName)); 
} 

if (queryCity != null && queryCity!= "") 
{ 
    predicate = predicate.And(p => p.City.StartsWith(queryCity)); 
} 

if (queryStatusList != null && queryStatusList.Count() > 0) 
{ 
    predicate = predicate.And(p => queryStatusList.Contains(p.Status)); 
} 

var result = db.Companies 
       .Select(c => new Company 
       { 
        Id = record.Id, 
        Name = record.Name, 
        City = record.City, 
        Status = record.Status 
       } 
       .Where(predicate); 
+0

감사합니다. 도움에 정말 감사드립니다. 나는 그것을 작동 시키려고 몇 시간을 보냈다. 대답을 보게되면 매우 쉽게 보입니다. 다시 한번 감사드립니다 ...... – Rick

+0

위대한 술어 예제에 감사드립니다. 필자는 PredicateBuilder 클래스를 사용한 적이 없다. 아주 좋아 보인다. – Rick