C# Linq to Sql-如果';包含';where子句中的值为null

C# Linq to Sql-如果';包含';where子句中的值为null,c#,asp.net,contains,C#,Asp.net,Contains,如果值(data.vendorname)为null,我需要获取所有vendorname,并给出一个错误异常:“值不能为null。” public HttpResponseMessage PostFilter([FromBody]动态数据) { 字符串[]vendorname=data.vendorname!=null ?data.vendorname.ToObject() :null; var items=(来自context.AllInventories中的s) 哪里 (vendorname!

如果值(data.vendorname)为null,我需要获取所有vendorname,并给出一个错误异常:“值不能为null。”

public HttpResponseMessage PostFilter([FromBody]动态数据)
{
字符串[]vendorname=data.vendorname!=null
?data.vendorname.ToObject()
:null;
var items=(来自context.AllInventories中的s)
哪里
(vendorname!=null
?vendorname.包含(s.vendorname)
:1==1)
选择(s)
.取(500)
.ToList();
}

如果
vendorname
为空,为什么不简化这一点,不在
中应用任何

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();
}
public HttpResponseMessage PostFilter([FromBody]动态数据)
{
字符串[]vendorname=data.vendorname!=null
?data.vendorname.ToObject()
:null;
var query=context.AllInventories.AsQueryable();
if(vendorname!=null)
{
query=query.Where(s=>vendorname.Contains(s.vendorname));
}
var items=query.Take(500.ToList();
}

如果
vendorname
为空,为什么不简化这一点,不在
中应用任何

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();
}
public HttpResponseMessage PostFilter([FromBody]动态数据)
{
字符串[]vendorname=data.vendorname!=null
?data.vendorname.ToObject()
:null;
var query=context.AllInventories.AsQueryable();
if(vendorname!=null)
{
query=query.Where(s=>vendorname.Contains(s.vendorname));
}
var items=query.Take(500.ToList();
}

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

IEnumerable<Inventory> inventories = context.AllInventories;
if(vendorname != null)
    inventories = inventories.Where(i => vendorname.Contains(i.VENDORNAME));             
inventories = inventories.Take(500).ToList(); 
IEnumerable inventory=context.allInventory;
if(vendorname!=null)
存货=存货。其中(i=>vendorname.Contains(i.vendorname));
存货=存货.Take(500).ToList();

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

为什么不使用简单的
if
-语句呢

IEnumerable<Inventory> inventories = context.AllInventories;
if(vendorname != null)
    inventories = inventories.Where(i => vendorname.Contains(i.VENDORNAME));             
inventories = inventories.Take(500).ToList(); 
IEnumerable inventory=context.allInventory;
if(vendorname!=null)
存货=存货。其中(i=>vendorname.Contains(i.vendorname));
存货=存货.Take(500).ToList();


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

从哪里获得异常?您确定要使用数据吗!=null?您可以使用C#6 null传播程序改进null检查的优雅性:
string[]vendorname=data?.vendorname?.ToObject()@romanoza在选择查询时给出异常。每当vendorname为null时,它就会给出一个异常“值不能为null”。从哪里获得该异常?您确定要使用数据吗!=null?您可以使用C#6 null传播程序改进null检查的优雅性:
string[]vendorname=data?.vendorname?.ToObject()@romanoza在选择查询时给出异常。每当vendorname为null时,它都会给出一个异常“Value cannot be null.”可以代替
query=context.AllInventories.Where(s=>vendorname.Contains(s.vendorname))它可以使用
query=query.Where(s=>vendorname.Contains(s.vendorname))
允许进一步的查询构建(或者如果前面会构建更多的查询)。我认为对于multiple where子句条件,这对我没有帮助,因为我需要提到multiple if条件,这不是一个好的解决方案。还有其他解决方案吗?为什么多重if和多重where不是一个好的解决方案?在您调用ToList或其他从数据库(或其他源)具体化数据的方法之前,查询实际上不会执行。@Jure,您说得对,
Query=Query。我的意图是什么,谢谢您的帮助catch@ArsalanK,恰恰相反,这是一个非常好的方法,用于多个where's,因为它只允许您在查询中保留必要的条件,较小的查询可能意味着更干净的SQL代码和更快的执行,而不是
query=context.AllInventories.Where(s=>vendorname.Contains(s.vendorname))它可以使用
query=query.Where(s=>vendorname.Contains(s.vendorname))
允许进一步的查询构建(或者如果前面会构建更多的查询)。我认为对于multiple where子句条件,这对我没有帮助,因为我需要提到multiple if条件,这不是一个好的解决方案。还有其他解决方案吗?为什么多重if和多重where不是一个好的解决方案?在您调用ToList或其他从数据库(或其他源)具体化数据的方法之前,查询实际上不会执行。@Jure,您说得对,
Query=Query。我的意图是什么,谢谢您的帮助catch@ArsalanK,恰恰相反,这是一个非常好的方法,用于多个where's,因为它只允许您在查询中保留必要的条件,较小的查询可能意味着更干净的SQL代码和更快的执行。我有多个参数以及vendorname,为此,我需要提及多个条件:/@ArsalanK:就可读性、可维护性、可测试性和性能而言,这仍然是最好的方法。我有多个参数以及vendorname,为此,我需要提到多个条件:/@ArsalanK:在可读性、可维护性、可测试性和性能方面仍然是最好的方法。