LINQ在哪里或过滤c#

时间:2011-05-10 18:56:03

标签: c# linq

我有一个由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;

有什么建议吗?正确的答案是最全面的答案 - 包括文件,最佳实践等......

5 个答案:

答案 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());

使用扩展来描述这样的状态将提高可读性,将来添加/删除状态代码会更容易。