>我有一个由 Web 服务返回的集合。这个集合的一个属性是"StatusCode",它是一个字符串值,可以是 0 到 5 之间的任何位置(不要问我为什么把它设置为字符串......我没有图解这个)。最初我打算使用 LINQ 来过滤它,然后意识到这很愚蠢(当我需要 20% 时,为什么要返回 100% 的记录),我参数化了我的存储过程来为我执行此操作。
无论如何,我编写了一个有效的 LINQ 查询,但出于好奇的考虑,我想有更好的方法可以做到这一点:
var wo = from w in workOrders
where w.StatusCode == "0"
|| w.StatusCode == "1"
|| w.StatusCode == "2"
select w;
有什么建议吗?正确答案指向最彻底的答案 - 包括文档、最佳实践等......
var wo = from q in workOrders where int.Parse(w.StatusCode) < 3 select w;
至少是执行 LINQ 查询的更简洁的方法。
var wo = from w in workOrders
where new[]{"0", "1", "2"}.Contains(w.StatusCode)
select w;
顺便说一句,如果您使用的是 ORM,您可以在 LINQ 中执行此操作(如上所述),并且只从数据库中提取 20% ;)
我最近写了一篇关于使用扩展方法和参数的方法的博客文章。
通过将此扩展方法添加到代码中:
public static bool IsIn<T>(this T source, params T[] values)
{
return values.Contains(source);
}
您可以像这样执行搜索:
var wo = from w in workOrders
where w.StatusCode.IsIn("0", "1", "2")
select w;
它适用于任何类型(只要您创建一个好的 equals 方法)。 肯定是任何值类型。
您可以定义一个IsIn()
泛型扩展方法:
public static bool IsIn<T>(this T value, params T[] values)
{
return values.Contains(value);
}
然后你可以像这样编写查询:
var wo = from q in workOrders where w.IsIn("1","2","3") select w;
你的方法没问题。我不认为 3 个字符串值需要解析或查找集合(但它肯定没有错)。使用解析,我会害怕空字符串或空值(即使我们知道应该只有字符串 0-5)。
如果您希望在更多地方进行这样的过滤,您可能应该在 WorkOrder 上创建方法(或扩展),该方法可以更富有表现力地确定当前状态,例如
public static bool IsNotCompleted(this WorkOrder workOrder)
{
return workOrder.Status == "0" || workOrder.Status == "1" || workOrder.Status == "2";
}
然后
var wo = from o in workOrders where o.IsNotCompleted() select o;
或者(我个人更喜欢这个sytaxe)
var wo = workOrders.Where(o => o.IsNotCompleted());
使用扩展来描述这样的状态将提高可读性,并且将来添加/删除状态代码会容易得多。