2009-10-14 76 views
2

我想创建一个扩展方法,我可以转发IList的状态并检查它们存在的天气,我认为最好的方法是做一个ILIST - 但也许我错了?这是将多个项目传递给方法的最佳方式 - 列表?它是一个通用的LIST,因此不会从Object转换等。LINQ:检查一个字段(db)是否包含ILIST中的项目?

基本上我有这个作为签名。

public static IQueryable<Building> WithStatus(this IQueryable<Building> qry, 
      IList<BuildingStatuses> buildingStatus) 
    { 

     //PSUEDO CODE 
     //return from v in qry 
     //  where v.Status is IN MY LIST called buildingStatus 
     //  select v; 
    } 

并调用它我使用(下面的例子是在我的TDD中),它的工作原理很好,值在我上面的方法到达。

target.GetBuildings().WithStatus(new List<BuildingFilters.BuildingStatuses>() 
      { BuildingFilters.BuildingStatuses.Available, 
      BuildingFilters.BuildingStatuses.Decommissioned }); 

所以基本上我有我的列表(IList的)它到达的扩展方法有2个值这是伟大的,但需要在LINQ说我需要说

 return from v in qry 
       where v.Status is IN MY LIST called buildingStatus 
       select v; 

非常感谢所有帮助,

至于我的扩展方法,它可以作为我已经做了类似1但只传递一个类型BuildingStatus因此只有1 ...

+0

感谢您的两点意见,是的,这是很大的,忘了提,我需要调用扩展方法上的所谓向GetStringValue列表项的每个值,因为列表枚举命名BuildingStatuses的集合, GetStringValue是一个扩展方法,它返回一个字符串,我通过一个Attribute添加到每个Enum上。我想有些lambda可以做到这一点?我不确定,有什么想法? – 2009-10-14 13:15:02

+0

如果我不调用扩展方法(它的工作原理),那么显然这个枚举将返回一个整数和它所需的字符串表示形式。我希望我能够解释这一点。 – 2009-10-14 13:19:54

+0

我接受了一个答案,因为我的问题已经有一段时间了,并且接受的答案给了我正在寻找的解决方案 – 2009-10-14 13:48:22

回答

5

将这项工作对您:

return from v in qry 
     where buildingStatus.Contains(v.Status) 
     select v; 
+0

尽管问题已得到解答,但无法与已编译的查询一起使用。 – usr 2012-01-22 13:18:45

1

可以使用IEnumerable<T>.Contains扩展方法,让你的方法更通用:

public static IQueryable<Building> WithStatus(this IQueryable<Building> qry, 
      IEnumerable<BuildingStatuses> buildingStatus) 
{ 

    return from v in qry 
      where buildingStatus.Contains(v.Status) 
      select v; 
} 
相关问题