我正在处理LINQ语句。我有一张城市表,其中记录有countryId
或stateId
。我只想编写一个语句,并让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还是很陌生,我知道这段代码是不正确的,只是将它添加到上下文中。
答案 0 :(得分:1)
如果display
和State
的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
如果参数是互斥的,一个取代另一个,等等,则添加您可能需要的任何逻辑。