2016-08-29 4 views
0

제품 표가 있으며 제품에는 색상, 유형 등 여러 가지 필터 사양이 지정 될 수 있습니다. 제품에 지정된 필터 값은 찾아보기 테이블에 저장됩니다. 테이블은 좀 더 복잡하지만 난에서 작업 할 수있는 간단한 예는 다음과 같습니다 : 사용자가 '블랙'제품을 선택웹 응용 프로그램에서의 제품 필터링

Products 
----------------- 
ProdID | Code | Price 
1  | A1 | 2.99 
2  | B1 | 10.99 
10  | F4 | 20.00 


Filters 
----------------- 
FilterID | Name 
1  | Black 
2  | Blue 
4  | Round 
10  | Waterproof 


ProductFilterLookup 
------------------- 
ProdID | FilterID 
1  | 1 
1  | 4 
1  | 10 
2  | 1 
2  | 10 
10  | 1 

그래서 경우 '방수'(에서 FilterId의 1, 10) 예상 된 결과 것 ProdID가 1과 2 인 경우 해당 제품에만 해당 필터가 모두 있기 때문입니다.

제품에 할당 된 모든 필터가있을 수 있습니다. 모든 필터 값을 가진 필터를 선택한 모든 필터를 얻고 싶습니다.

LINQ 또는 SQL에서이 작업을 수행 할 수 있으며 가능한 한 효율적으로 수행해야합니다 (성능 현명한).

+0

몇 가지 샘플 표 d 추가 ata와 기대되는 결과. – jarlh

+0

나를 위해 3 가지 방법이 있습니다. 첫 번째는 원시 SQL 문을 SQL Server로 보내고, 두 번째는 Entity Framwork를 사용하고 세 번째는 형식화 된 DataSets를 사용하는 것입니다. 여러분의 응용 프로그램 유형을 안전하게 만들 수 있습니다. – Radinator

+0

그러나 귀하의 SQL 명령 : 당신은 필터 테이블과 제품 테이블과 필터 테이블에있는 하위 SELECT를 사용하여 FilterID가 귀하의 값과 동일한 조회 테이블을 통해 SELECT를 만들어야 만합니다. – Radinator

답변

1

성능 향상을 위해 - linq를 SQL과 같이 빠르게 사용할 수 있습니다. 그냥 SQL과 linq을 가지고 둘의 설명 계획을 비교하십시오. linq에 대해 생성 된 sql을 확인하십시오.

당신이 할 수있는 시험 :

var neededFilters = new List<string> { "Black", "Waterproof" }; 

var result1 = (from p in products 
       join pf in productFilterLookup on p.ProdID equals pf.ProdID 
       join f in filters on pf.FilterID equals f.FilterID 
       group f.Name by p into grouping 
       where neededFilters.All(filter => grouping.Contains(filter)) 
       select grouping.Key).ToList(); 

var result = (from p in products 
       join f in (from pf in productFilterLookup 
         join f in filters on pf.FilterID equals f.FilterID 
         select new { pf.ProdID, f.Name }) 
         on p.ProdID equals f.ProdID into grouping 
       where neededFilters.All(filter => grouping.Any(item => item.Name == filter)) 
       select p).ToList(); 
+0

linq 또는 SQL? * –

+0

감사합니다.이 시도해보십시오. – Simon

+0

완벽하게 일했습니다 - 감사합니다 – Simon

0

@ 사이먼

가 귀하의 질문에 대답하려면,이 SQL 문은 당신을 도울 것입니다 :

SELECT pfl.id, p.productid, p.code, p.price, f.filterid, f.name 
FROM 
    productfilterlookup pfl 
INNER JOIN 
    products p ON (pfl.productid = p.productid) 
INNER JOIN 
    filters f ON (pfl.filterid = f.filterid) 
WHERE pfl.filterid = 1 OR pfl.filterid = 10; 

이이 같은 몇 가지 출력을 넣어 것입니다 :

+----+-----------+------+-------+----------+--------------+ 
| id | productid | code | price | filterid | name   | 
+----+-----------+------+-------+----------+--------------+ 
| 1 |   1 | A1 | 2.99 |  1 | Black  | 
| 3 |   1 | A1 | 2.99 |  10 | Waterproofed | 
| 4 |   2 | B1 | 10.99 |  1 | Black  | 
| 5 |   2 | B1 | 10.99 |  10 | Waterproofed | 
| 6 |  10 | F4 | 20.00 |  1 | Black  | 
+----+-----------+------+-------+----------+--------------+ 
+0

고마워, 문제는 내가 얼마나 많은 필터가 선택 될지 모르겠다. 나는 코드를 동적으로 생성 할 수 있다고 생각한다. – Simon

+0

SQL로 만들면 동적으로 SQL 문을 생성 할 수 있습니다. => 위의 코드를 취하고 - 루프가 생성 된 부분을 SELECT ... FROM ... INNER JOIN에 추가하십시오. 부분 – Radinator

관련 문제