簡體   English   中英

動態Linq構建,其中包含多個參數

[英]Dynamic Linq Build Where Clause many Parameters

我會解釋我的問題

因此,首先,我動態地將Predicates Linq用於Build Where子句。 我必須動態構建,因為我不知道會有多少參數。 讓我舉個例子吧。 對於A列,可以是一個參數,但是對於B列,可以是2個參數,例如選擇值'Gas'或'Oil',但這是一個大問題,我無法正確組合這兩個列。 因此,此代碼有效,但返回0個項目。 但是我知道。

public List<CarEntity> GetSearchByKCriteria(int cityId, List<string> fuelType, List<string> gearType, List<string> budget,
        List<string> caroser, List<string> enginePower)
    {
        Expression<Func<Car, bool>> query = null;
        Expression<Func<Car, bool>> combine = null;

        foreach (var bud in budget)
        {
            if (budget.Count >= 1)
            {
                if (bud == "1")
                {
                    if (budget.Count > 1)
                    {
                        query = car => car.Budget >= 20000 && car.Budget <= 34999;
                    }
                    else
                    {
                        query = car => car.Budget >= 20000 && car.Budget <= 34999;
                    }

                }
                else if (bud == "2")
                {

                    if (query != null)
                    {
                        combine = car => (car.Budget >= 35000 && car.Budget <= 49999);
                        query = query.Or(combine);

                    }
                    else
                    {
                        query = car => car.Budget >= 35000 && car.Budget <= 49999;

                    }
                }
            }
        }
        foreach (var caros in caroser)
        {
            if (caros != "-1" && !string.IsNullOrEmpty(caros))
            {
                if (query != null)
                {
                    if (query.Expand().ToString().ToLower().Contains("karoser"))
                    {
                        combine = car => (car.Karoser == caros);
                        query = query.And(combine);

                    }
                    else
                    {
                        combine = car => car.Karoser == caros;
                        query = query.And(combine);

                    }

                }
                else
                {
                    query = car => car.Karoser == caros;
                }
            }
        }
        foreach (var fuel in fuelType)
        {
            if (fuel != "-1" && !string.IsNullOrEmpty(fuel))
            {
                if (query != null)
                {
                    if (query.Expand().ToString().ToLower().Contains("yakituru"))
                    {
                        combine = car => (car.YakitTuru==fuel);
                        query = query.Or(combine);

                    }
                    else
                    {
                        combine = car => car.YakitTuru == fuel;
                        query = query.And(combine);

                    }

                }
                else
                {
                    query = car => car.YakitTuru == fuel;
                }
            }
        }
        foreach (var gear in gearType)
        {
            if (gear!="-1"&& !string.IsNullOrEmpty(gear))
            {
                if (query != null)
                {
                    if (query.Expand().ToString().ToLower().Contains("sanzimantipi"))
                    {
                        combine = car => (car.SanzimanTipi == gear);
                        query = query.Or(combine);

                    }
                    else
                    {
                        combine = car => car.SanzimanTipi == gear;
                        query = query.And(combine);

                    }

                }
                else
                {
                    query = car => car.SanzimanTipi == gear;
                } 
            }
        }
        foreach (var engine in enginePower)
        {
            if (enginePower.Count >= 1)
            {
                if (engine == "1")
                {
                    if (query != null)
                    {
                        if (query.Expand().ToString().ToLower().Contains("silindirhacmi"))
                        {
                            combine = car => (car.SilindirHacmi >= 0 && car.SilindirHacmi <= 1600);
                            query = query.Or(combine);

                        }
                        else
                        {
                            combine = car => (car.SilindirHacmi >= 0 && car.SilindirHacmi <= 1600);
                            query = query.And(combine);

                        }

                    }
                    else
                    {
                        query = car => car.SilindirHacmi >= 0 && car.SilindirHacmi <= 1600;
                    }
                }

                if (engine == "3")
                {
                    if (query != null)
                    {
                        if (query.Expand().ToString().ToLower().Contains("silindirhacmi"))
                        {
                            combine = car => (car.SilindirHacmi >= 1601 && car.SilindirHacmi <= 1800);
                            query = query.Or(combine);

                        }
                        else
                        {
                            combine = car => (car.SilindirHacmi >= 1601 && car.SilindirHacmi <= 1800);
                            query = query.And(combine);

                        }

                    }
                    else
                    {
                        query = car => car.SilindirHacmi >= 1601 && car.SilindirHacmi <= 1800;
                    }
                }

        }

        using (var context = DataContextFactory.CreateContext())
        {

            var result = (from fkCar in context.Car.Where(query)
                          join pkCarBrand in context.CarBrand on fkCar.Marka equals pkCarBrand.ID
                          where fkCar.IsActive == true

                          select new
                          {
                              entity = fkCar,
                              joinEntity = pkCarBrand
                          });
            List<CarEntity> theCarList = new List<CarEntity>();
            foreach (var item in result)
            {
                CarEntity theEntity = Mapper.Map(item.entity);
                theEntity.CarBrand = Mapper.Map(item.joinEntity);
                theCarList.Add(theEntity);

            }
            return theCarList;
        }
    }

因此,感謝您的答復,

不久前,我還面臨着類似的挑戰,我想要一個屬性的允許值列表,如果匹配,關聯實例將通過過濾器。 我想出了以下擴展方法:

static public Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values)
{
    if (null == valueSelector)
    {
        throw new ArgumentNullException("valueSelector");
    }
    if (null == values) { throw new ArgumentNullException("values"); }

    ParameterExpression p = valueSelector.Parameters.Single();
    if (!values.Any())
    {
        return e => false;
    }

    var equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
    var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
    return Expression.Lambda<Func<TElement, bool>>(body, p);
}

這基於在http://www.velocityreviews.com/forums/t645784-linq-where-clause.html上發布的討論和代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM