我有一个由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;
有什么建议吗?正确的答案是最全面的答案 - 包括文件,最佳实践等......
答案 0 :(得分:2)
var wo = from w in workOrders
where new[]{"0", "1", "2"}.Contains(w.StatusCode)
select w;
顺便说一下,如果你使用的是ORM,你可以在LINQ中进行(如上所述),只从数据库中提取20%;)
答案 1 :(得分:2)
var wo = from q in workOrders where int.Parse(w.StatusCode) < 3 select w;
至少可以更简洁地执行LINQ查询。
答案 2 :(得分:2)
我最近写了一篇关于使用扩展方法和参数的方法的blog post。
将此扩展方法添加到您的代码中:
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方法)。任何值类型肯定。
答案 3 :(得分:1)
您可以定义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;
答案 4 :(得分:1)
你的方法还可以。我不认为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());
使用扩展来描述这样的状态将提高可读性,将来添加/删除状态代码会更容易。