[SQL] 점진적는 OR 쿼리 식을 구축 [중복]
SQL점진적는 OR 쿼리 식을 구축 [중복]
LINQ에서 하나 점진적으로뿐만 따르는 LINQ 쿼리를 구축 할 수 있습니다 :
var context = new AdventureWorksDataContext();
// Step 1
var query = context.Customers.Where(d => d.CustomerType == "Individual");
// Step 2
query = query.Where(d => d.TerritoryID == 3);
상기 질의는 다음과 같은 논리 연산자에 의해 함께 결합 된 두 개의 술어 포함하는 WHERE 절 등가 SQL 문을 수득 것이다 :
SELECT * FROM Customers WHERE CustomerType = 'Individual' AND TerritoryID = 3
하나는 점진적으로, 동등한 SQL 문을 산출하는 LINQ 쿼리를 구축 할 수 같은 결과 쿼리로이 따르는 OR 논리 연산자에 의해 함께 결합 된 조건과 WHERE 절을 가지고?
SELECT * FROM Customers WHERE CustomerType = 'Individual' OR TerritoryID = 3
해결법
-
==============================
1.당신은 당신이 합성 쿼리로 사용할 수있는 하나의 람다에 필터를 먼저 필터를 구성하고 결합해야합니다 :
당신은 당신이 합성 쿼리로 사용할 수있는 하나의 람다에 필터를 먼저 필터를 구성하고 결합해야합니다 :
var filters = new List<Expression<Func<YourType, bool>>>(); filters.Add(d => d.TerritoryID == 3); filters.Add(d => d.CustomerType == "Individual"); ... var lambda = AnyOf(filters.ToArray()); // this is: d => d.TerrotoryID == 3 || d.CustomerType == "Individual"; var data = src.Where(lambda);
사용 :
static Expression<Func<T,bool>> AnyOf<T>( params Expression<Func<T,bool>>[] expressions) { if (expressions == null || expressions.Length == 0) return x => false; if (expressions.Length == 1) return expressions[0]; var body = expressions[0].Body; var param = expressions[0].Parameters.Single(); for (int i = 1; i < expressions.Length; i++) { var expr = expressions[i]; var swappedParam = new SwapVisitor(expr.Parameters.Single(), param) .Visit(expr.Body); body = Expression.OrElse(body, swappedParam); } return Expression.Lambda<Func<T, bool>>(body, param); } class SwapVisitor : ExpressionVisitor { private readonly Expression from, to; public SwapVisitor(Expression from, Expression to){ this.from = from; this.to = to; } public override Expression Visit(Expression node) { return node == from ? to : base.Visit(node); } }
-
==============================
2.당신은 두 단계를 원하는 경우, 당신은 노동 조합을 사용할 수 있습니다 : VAR 컨텍스트는 새로운 AdventureWorksDataContext을 () =; // 1 단계 VAR 쿼리 = context.Customers.Where (d => d.CustomerType == "개인"); // 2 단계 쿼리 = query.Union (context.Customers.Where (d => d.TerritoryID == 3));
당신은 두 단계를 원하는 경우, 당신은 노동 조합을 사용할 수 있습니다 : VAR 컨텍스트는 새로운 AdventureWorksDataContext을 () =; // 1 단계 VAR 쿼리 = context.Customers.Where (d => d.CustomerType == "개인"); // 2 단계 쿼리 = query.Union (context.Customers.Where (d => d.TerritoryID == 3));
-
==============================
3.직접 이런 종류의 작업을 수행 할 수 있지만, 정말 쉽게 프로그레시브 쿼리 작성을 만드는 LinqKit 라이브러리를 사용 :
직접 이런 종류의 작업을 수행 할 수 있지만, 정말 쉽게 프로그레시브 쿼리 작성을 만드는 LinqKit 라이브러리를 사용 :
당신은 끝낼 것이다 :
var context = new AdventureWorksDataContext(); // Step 1 var query = context.Customers.Where(d => d.CustomerType == "Individual"); // Step 2 query = query.Or(d => d.TerritoryID == 3);
내가 일하고 있어요 시스템이 많이 필요로하고 LinqKit 주요 생명의 은인이다. 당신은 여기에서 찾을 수 있습니다.
(참고 : - 그냥 팬 어쨌든에서 LinqKit의 개발자와 제휴 아니에요.)
-
==============================
4.동적의 LINQ lib 디렉토리를 사용하지 않고 당신이 무엇을 물어 달성하기 위해, 당신은 람다 식을 구축하는 데 사용할 다음, where 절에서 각 시험에 대한 표현을 정의 할 수 있습니다 :
동적의 LINQ lib 디렉토리를 사용하지 않고 당신이 무엇을 물어 달성하기 위해, 당신은 람다 식을 구축하는 데 사용할 다음, where 절에서 각 시험에 대한 표현을 정의 할 수 있습니다 :
Expression<Func<Customer, bool>> isIndividualCustomer = c => c.CustomerType == "Individual"; Expression<Func<Customer, bool>> territoryIdIs3 = c => c.TerritoryID == 3; Expression<Func<Car, bool>> customerIsIndividualOrOfTerritoryId3 = Expression.Lambda<Func<Customer, bool>>( Expression.Or(isIndividualCustomer.Body, territoryIdIs3.Body), isIndividualCustomer.Parameters.Single());
용법:
var query = context.Customers.Where(customerIsIndividualOrOfTerritoryId3);
from https://stackoverflow.com/questions/15677492/build-an-or-query-expression-progressively by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] plpgsql의 트리거 기능에 여러 열을 업데이트 (0) | 2020.06.13 |
---|---|
[SQL] SQL : 실시간 트랜스 (0) | 2020.06.13 |
[SQL] 마이크로 소프트 액세스 2010 .accdb에 대한 SQL 연결 문자열 (0) | 2020.06.13 |
[SQL] MS Access에서 CONCAT 동등한 (0) | 2020.06.13 |
[SQL] 어떻게 동적으로 PostgreSQL의 8.2 TG_TABLE_NAME를 사용 하는가? (0) | 2020.06.13 |