Если утверждения в статье 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;
}