【问题标题】:Linq to Sql - return all data if 'contains' value is null in where clauseLinq to Sql - 如果 where 子句中的“包含”值为空,则返回所有数据
【发布时间】:2016-05-15 08:16:38
【问题描述】:

如果 value(data.vendorname) 为空,我需要获取所有供应商名称,它会给出错误异常:“值不能为空。”

public HttpResponseMessage PostFilter([FromBody] dynamic data)
{
    string[] vendorname = data.vendorname != null
                          ? data.vendorname.ToObject<string[]>()
                          : null;

    var items = (from s in context.AllInventories
                 where
                    (vendorname!=null
                     ? vendorname.Contains(s.VENDORNAME)
                     :1==1)
                 select s)
                 .Take(500)
                 .ToList();
}

【问题讨论】:

  • 你从哪里得到异常?你确定 data != null 吗?
  • 您可以使用 C#6 空传播器提高空检查的优雅性:string[] vendorname = data?.vendorname?.ToObject&lt;string[]&gt;();
  • @romanoza 在选择查询时给出异常。每当供应商名称为空时,它都会给出异常“值不能为空”。

标签: c# asp.net contains


【解决方案1】:

如果vendorname 为空,您为什么不通过根本不应用任何where 来简化这一点?

public HttpResponseMessage PostFilter([FromBody] dynamic data)
{
    string[] vendorname = data.vendorname != null
                          ? data.vendorname.ToObject<string[]>()
                          : null;

    var query = context.AllInventories.AsQueryable();
    if (vendorname != null)
    {
        query = query.Where(s => vendorname.Contains(s.VENDORNAME));
    }

    var items = query.Take(500).ToList();
}

【讨论】:

  • 也许可以使用query = query.Where(s =&gt; vendorname.Contains(s.VENDORNAME)); 代替query = context.AllInventories.Where(s =&gt; vendorname.Contains(s.VENDORNAME)); 来允许进一步构建查询(或者如果预先构建更多查询)。
  • 我认为对于多个 where 子句条件它对我没有帮助,因为为此我需要提及多个 if 条件,这不是一个好的解决方案。还有其他解决方案吗?
  • 为什么多个 if 和 multiple where 不是一个好的解决方案?直到您调用 ToList 或其他将数据库(或其他来源)中的数据具体化的方法,查询才会真正执行。
  • @Jure,你说得对,query = query.Where 是我的本意,谢谢你的收获
  • @ArsalanK,恰恰相反,这对于多个 where 是一个非常好的方法,因为它允许您在查询中只保留必要的条件,而较小的查询可能意味着更干净的 SQL 代码和更快的执行速度跨度>
【解决方案2】:

为什么不使用简单的if-statement?

IEnumerable<Inventory> inventories = context.AllInventories;
if(vendorname != null)
    inventories = inventories.Where(i => vendorname.Contains(i.VENDORNAME));             
inventories = inventories.Take(500).ToList(); 

这比希望您的 sql 技巧有效并且优化器足够聪明以忽略您的伪条件要好得多。调试也比较好。

【讨论】:

  • 好吧,我有多个参数以及供应商名称,为此我需要提及多个 if 条件。 ://
  • @ArsalanK:在可读性、可维护性、可测试性和性能方面仍然是最好的方法。
猜你喜欢
  • 2012-12-25
  • 2011-01-25
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2011-11-25
相关资源
最近更新 更多