4

:LIKE 연산자로도 사용할 LINQ IN 절 쿼리를 작성하는 방법은 무엇입니까? 우리가 선택 SQL 쿼리 다음에 대한 LINQ 쿼리를 쓸 수있는 방법

string brandid="1,2,3" 
string bodystyleid="1,2,3" 
------------------- 
----------------- 

select * from car 
where brandid in (brandid) 
and bodystyleid in (brandid) 
---------------------- 
------------------- 

내 특정 요구 brandid 또는 bodystyleid가 비어있는 경우 쿼리한다 (사용자가 에게 특정 검색 옵션의 확인란을 선택하지 않는 경우)이다 해당 특정 조건에 대한 모든 레코드를 리턴하십시오.

안내해주세요.

감사합니다,

답변

6

지정하지 않은 경우 모든 항목을 반환하는 요구 사항을 충족하려면 목록이 비어 있는지 확인해야합니다.

var brands = brandid.Split(',').Select(x => Int32.Parse(x)); 
var styles = bodystyleid.Split(',').Select(x => Int32.Parse(x)); 

var result = from c in car 
      where (!brands.Any() || brands.Contains(c.brandid)) 
        && (!styles.Any() || styles.Contains(c.bodystyleid)) 
      select c; 
(sgmoore의 솔루션과 유사하지만 지정되지 브랜드/스타일의 체크 포함)

난 사실이 SQL로 다시 변환되는 방식을 선택하지 않은 한

-을 사용하는 것이 더 효율적일 수 있습니다을 어떤 값이 있는지를 나타내는 플래그 :

var brands = ....; // As above 
bool anyBrands = brands.Any() 
var result = from c in car 
      where (!anyBrands || brands.Contains(c.brandid)) 
       ..... 
+0

감사합니다. 이 시나리오에서 나에게 성능 현명한 저장 프로 시저를 작성하거나 LINQ를 사용하는 것이 더 좋을 것이라고 제안 해 주시겠습니까? – Paul

+0

@Paul - Sqlserver의 추적 도구를 실행하여 생성되는 SQL을 확인한 다음 더 나은 SQL을 작성할 수 있는지 확인하십시오. 더 나은 실행 계획이나 실행 계획이있는 것은 무엇이든 사용하십시오. – gbjbaanb

2

는 brandid 또는 bodystyleid을 확인하는 의미 bodystyleid인가? 당신이 할 수있는 시작으로

(나는 bodystyleid을 가정하고, 그러나 문제의 쿼리 (brandid)과 일치하도록 쿼리를 썼다) :

var results = (from c in car 
       where c.brandid.Contains(brandid) 
       && c.bodystyleid.Contains(brandid) 
       select c).ToList(); 
0

Id의 당신이 쉼표로 문자열로 있습니다 구분, 당신은 그들이 Car 테이블의 당신의 Id의 동일한 유형의 List 같은 컬렉션을해야하므로 brandidint 다음 brandidsList<long> 될하는 경우에, 당신은

을 수행 할 수 있습니다 0
2
var brandids  = brandid .Split(',').Select(n => int.Parse(n)).ToList(); 
var bodyStyleids = bodystyleid.Split(',').Select(n => int.Parse(n)).ToList(); 


var results = 
    (from c in car where 
     brandids.Contains(c.brandid) && 
     bodyStyleids.Contains(c.bodystyleid) 
    select c 
    ).ToList();