如果Linq where子句内的语句

时间:2010-07-20 14:51:28

标签: linq if-statement where-clause

今天苦苦挣扎。

我有以下方法返回产品列表..爱情。

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();
  • 基础材料&amp;来源是下拉列表。

如何将一些IF语句合并到where子句中?

例如,如果未触摸basematerial ddl但选择了源ddl中的项目,则结果将返回与basematerial相关但由所选源过滤的所有内容。

这甚至有意义吗?!

我甚至不确定我采取了正确的方法 - 请原谅我的无知。

2 个答案:

答案 0 :(得分:16)

您可以根据需要将它们添加到您的查询中:

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();

答案 1 :(得分:10)

考虑实施名为WhereIf

的扩展方法

你传递了两个参数:一个被评估为布尔值的语句和一个lambda函数。如果bool语句的计算结果为true,则添加lambda。

WhereIf on 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();

对于IEnumerableIQueryable,它们都是。这允许您在LINQ To SQL,实体框架,列表,数组以及实现这两个接口的任何其他内容中使用.WhereIf()

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;
}