복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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);
    
  5. from https://stackoverflow.com/questions/15677492/build-an-or-query-expression-progressively by cc-by-sa and MIT license