2009-10-14 78 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; 
} 
相關問題