【问题标题】:Linq passing multiple list in where conditionLinq 在 where 条件下传递多个列表
【发布时间】:2016-12-16 04:49:45
【问题描述】:

我通过传递过滤器从 db 获取结果。目前我已经通过code 列表并且我得到了正确的数据。下面是代码。

public DataTable getData(IList<string> Code, 
                         IList<string> category, 
                         IList<string> state, 
                         IList<string> Type, 
                         IList<string> general)
{
    DataTable dt = new DataTable();
    var result = _db.Sample.Where(x => Code.Contains(x.Code));

    if (result == null)
    {
        return null;
    }
    else
    {
        dt = Utility.ToDataTable(result.ToList());
    }

    return dt;
}

我必须再通过 4 个过滤器,即category, state, type and general。我还必须检查它们是否都为空。

我不确定如何检查 null 的值,然后将其传递给查询。

任何建议将不胜感激

【问题讨论】:

    标签: c# entity-framework linq lambda where-clause


    【解决方案1】:

    您可以检查是否所有 5 都为空,然后执行 lambda 表达式。要为 4 个额外的过滤器添加条件,请使用 &amp;&amp; 运算符并将其与代码过滤器一起添加。

    public DataTable getData(IList<string> Code, IList<string> category, IList<string> state, IList<string> Type, IList<string> general)
    
            {
                DataTable dt = new DataTable();
    
                  if(code==null)
                  code=''
                  if(category==null)
                  category=''
                  if(state==null)
                  state=''
                  if(general==null)
                  general=''               
    
                  var result = _db.Sample.Where(x => (Code.Contains(x.Code) || Code=='') && (category.Contains(x.category)|| category=='') && (state.Contains(x.state)||state=='') && (general.Contains(x.general)||general==''))
    
    
                if (result == null)
                {
                    return null;
                }
                else
                {
                    dt = Utility.ToDataTable(result.ToList());
                }
                return dt;
            }
    

    【讨论】:

    • 如果代码为空或任何其他参数为空,则不会执行查询
    • @OwaisAhmed 更新了我的答案
    • @JibinBalachandran 不会在其中任何一个为空时抛出空异常,因为空检查是在包含检查之后完成的?
    • @JibinBalachandran 您所做的更改只是添加了更多代码行。我给出的答案看起来不是比这个精确吗?
    【解决方案2】:

    我不确定您是要检查所有列表的包含还是只检查其中任何一个。我',为两者提供解决方案

     public DataTable getData(IList<string> Code, IList<string> category, IList<string> state, IList<string> Type, IList<string> general)
    
        {
            DataTable dt = new DataTable();
            var result = null;
            //result = _db.Sample.Where(x => Code.Contains(x.Code) && category.Contains(x.category) && state.Contains(x.state) && general.Contains(x.general));
            //if you wish to check for any one
            result = _db.Sample.Where(x => (Code != null && Code.Contains(x.Code)) || (category != null && category.Contains(x.category)) || (state != null && state.Contains(x.state)) || (general != null && general.Contains(x.general)));
    
    
            if (result == null)
            {
                return null;
            }
            else
            {
                dt = Utility.ToDataTable(result.ToList());
            }
            return dt;
        }
    

    【讨论】:

    • 但如果任何参数为空,则不会执行查询。我也想如果其中任何一个包含价值
    • @OwaisAhmed 我已经编辑了我的答案以适合您的上述查询
    • @JibinBalachandran 哈哈.. 谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 2017-02-28
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2012-05-06
    相关资源
    最近更新 更多