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를 사용하여보고 할 수 있습니다 :
감사합니다. 도움에 정말 감사드립니다. 나는 그것을 작동 시키려고 몇 시간을 보냈다. 대답을 보게되면 매우 쉽게 보입니다. 다시 한번 감사드립니다 ...... – Rick
위대한 술어 예제에 감사드립니다. 필자는 PredicateBuilder 클래스를 사용한 적이 없다. 아주 좋아 보인다. – Rick