Если утверждения в статье Linq where

Сегодня битва немного.

У меня есть следующий метод, который возвращает список продуктов....

public static List<tblWeight> GetProductInfo(string memberid, string locationid, string basematerial, string source)
        {
             MyEntities getproductinfo = new MyEntities ();

            return (from p in getproductinfo .tblWeights
                        where    p.MemberId == memberid &&
                                 p.LocationId == locationid &&
                                 p.BaseMaterialName == basematerial &&
                                 p.WeightStatus == source
                       select p)
                       .ToList();
  • Если базовые материалы и источники являются выпадающими списками.

Как мне включить включение нескольких операторов IF в предложение where?

Например, если базовый материал ddl не тронут, но выбран элемент в исходном ddl, результат будет возвращать все, что связано с базовым материалом, но фильтруется выбранным источником.

Это даже имеет смысл?!

Я даже не уверен, что я использую правильный подход - пожалуйста, простите мое невежество.

Ответ 1

вы можете добавить их в свой запрос по необходимости:

var r =  (from p in getproductinfo .tblWeights 
                        where    p.MemberId == memberid && 
                                 p.LocationId == locationid && 
                                 p.WeightStatus == source 
                       select p) 

if (!String.IsNullOrEmpty(basematrial))
    r = r.Where(p => p.BaseMaterialName == basematerial);

return r.ToList();

Ответ 2

Рассмотрите возможность применения этих методов расширения с именем WhereIf.

Вы передаете ему два параметра: оператор, вычисленный для логического и лямбда-функции. Если оператор bool оценивает значение true, добавляется лямбда.

WhereIf на ExtensionMethod.net

Ваш запрос может выглядеть так:

return getproductinfo.tblWeights
            .Where(w=> w.MemberId == memberid &&
                     w.LocationId == locationid)
            .WhereIf(!string.IsNullOrEmpty(basematerial), w=>w.BaseMaterialName == basematerial)
            .WhereIf(!string.IsNullOrEmpty(source), w=>w.WeightStatus == source)                         
            .ToList();

Здесь они равны как для IEnumerable, так и для IQueryable. Это позволяет использовать .WhereIf() в LINQ To SQL, Entity Framework, Lists, Arrays и все, что реализует эти 2 интерфейса.

public static IEnumerable<TSource> WhereIf<TSource>(this IEnumerable<TSource> source, bool condition, Func<TSource, bool> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

public static IEnumerable<TSource> WhereIf<TSource>(this IEnumerable<TSource> source, bool condition, Func<TSource, int, bool> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Func<TSource, bool> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Func<TSource, int, bool> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}