LINQ语句使用两个参数之一

时间:2019-04-18 17:17:26

标签: c# linq

我正在处理LINQ语句。我有一张城市表,其中记录有countryIdstateId。我只想编写一个语句,并让where子句检查两个参数中的哪个为空,然后在一个不为空的参数上进行选择。

这就是我正在使用的东西:

public List<City> Cities(int? countryTypeId, int? stateTypeId)
{
    if (countryTypeId == null && stateTypeId == null) 
        return null;

    return _db.City
        .Where(x => x.StateTypeId == stateTypeId
                    && x.CountryTypeId == countryTypeId)
        .OrderBy(x => x.Description)
        .ToDTOs();
}

我对LINQ还是很陌生,我知道这段代码是不正确的,只是将它添加到上下文中。

3 个答案:

答案 0 :(得分:1)

如果displayState的ID都是Country,则只需执行此操作,无需检查null

>0

否则,如注释中所述,如果这些可为空的输入具有值,则需要添加条件

编辑:看到一些评论后,如果您要根据任一参数查找 .Where(x => x.StateTypeId == stateTypeId.GetValueOrDefault() && x.CountryTypeId == countryTypeId.GetValueOrDefault()) 的列表,那么您应该在where条件中使用cities而不是|| < / p>

&&

请注意顺序很重要,此代码将首先检查Where(x => (stateTypeId.HasValue && stateTypeId.Value == x.StateTypeId) || (countryTypeId.HasValue && countryTypeId.Value == x.CountryTypeId)) 是否有价值,以及是否仅将stateTypeId与该cities匹配

答案 1 :(得分:0)

class BuyItem extends StatelessWidget {
  BuyItem(this.name, this.image);

  final String name;
  final String image;

  @override
  Widget build(BuildContext context) {
    ButtonsLists();

    return InkWell(
      child: Card(
        child: GridTile(
......

使用null conditional operators-当类型ID为null时,使用null coalescing operator返回false并使匹配失败-否则检查是否相等并返回匹配。

请注意cannot short circuit个OR运算符!

我不确定是否是这种情况,但是如果输入参数之一始终为空,并且确保条目始终具有一个属性为空,那么以下方法将是一个很不错的解决方案:

_db.City.Where(c => c.CountryTypeId?.Equals(countryTypeId) ?? false 
    | c.StateTypeId?.Equals(stateTypeId) ?? false);

答案 2 :(得分:0)

我的DBA已经把它深深地打入了头脑,以至于忽略查询中的参数(例如:WHERE Field = @PARAM或@PARAM IS NULL)会导致非常糟糕的事情。结果,我鼓励您有条件地仅添加您绝对需要的参数。幸运的是,鉴于您仅使用两个可能的参数,这是微不足道的。

从查询基础开始,然后添加到查询中。

var queryBase = _db.City.OrderBy(x => x.Description);

if (countryTypeId.HasValue)
{
    queryBase = queryBase.Where(x => x.CountryTypeId == countryTypeId);
}

if (stateTypeId.HasValue)
{
    queryBase = queryBase.Where(x => x.StateTypeId == stateTypeId);
}

return queryBase.ToDTOs(); // or .ToList() for a more universal outcome

如果参数是互斥的,一个取代另一个,等等,则添加您可能需要的任何逻辑。