Если заявления в Linq, где пункт - PullRequest
10 голосов
/ 20 июля 2010

Немного сегодня борюсь.

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

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, результат вернет все, что связано с базовым материалом, но отфильтровано выбранным источником.

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

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

Ответы [ 2 ]

16 голосов
/ 20 июля 2010

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

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();
10 голосов
/ 20 июля 2010

Рассмотрите возможность реализации этих методов расширения с именем 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;
}
...