LINQ 其中或筛选器 c#

  • 本文关键字:筛选 LINQ 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;

有什么建议吗?正确答案指向最彻底的答案 - 包括文档、最佳实践等......

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

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

相关内容

  • 没有找到相关文章

最新更新