2012-04-04 189 views
2

我有一種方法,它將字符串數組作爲參數,並針對集合屬性進行查詢,集合屬性也是字符串的集合。如果該屬性具有作爲參數傳遞的字符串數組內的值之一,則應返回該值。使用集合參數針對集合屬性的Linq查詢

這裏是我的代碼:

public IEnumerable<BlogPost> GetAll(string[] tags, 
    bool includeUnapprovedEntries = false) { 

    foreach (var tag in tags) { 
     foreach (var blogPost in GetAll(includeUnapprovedEntries). 
      ToList().Where(x => x.Tags.Any(t => t == tag))) { 
      yield return blogPost; 
     } 
    } 
} 

注:

下面是完整的代碼:

https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Data/DataAccess/SqlServer/BlogPostRepository.cs

這做工作,但它只是沒有按」 t看起來沒錯。我本來可以用一些擴展方法做得更好,但無法弄清楚會採取什麼措施並使此實現正確。

有什麼想法?

回答

4

如何:

public IEnumerable<BlogPost> GetAll(string[] tags, 
    bool includeUnapprovedEntries = false) { 

    return GetAll(includeUnapprovedEntries) 
     .Where(x => x.Tags.Any(t => tags.Contains(t)); 
} 

您可能需要調用ToList()兌現的結果。請注意,這將會(希望!)在SQL中產生一個IN查詢;如果你有大量的標籤,如果失敗了,我不會感到驚訝。 (我不知道Entity Framework如何處理這種情況。)但我相信應該可以使用較小數量的標籤。

請注意,不管這是否受支持可能取決於您使用的實體框架的版本;我似乎記得一些像這樣的轉換(使用「本地」集合上的Contains)在SQL中轉換爲IN)隨着時間的推移已經有所改進。確保你開發的版本與你將要部署的版本相同:)

+1

啊,我現在感覺很糟糕。我想我不應該在上午1點之後再編碼。謝謝! – tugberk 2012-04-04 07:13:16

+0

@tugberk:你有沒有檢查它實際上*工程*雖然?不要假設它會直到你嘗試過它:)我相當擅長預測LINQ to Objects如何表現,但我對Entity Framework的經驗很少(基本上爲零)。 – 2012-04-04 07:14:24

+0

另外,我應該提到這個查詢確實不會去SQL Server。我用分號分隔的字符串創建了一個標籤集合(因爲它在這裏:https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Data/DataAccess/SqlServer/Model/BlogPost.cs)。所以,它用'GetAll'獲取整個數據(是的,這是一個非常糟糕的方法,但我無法找出其他方法),並進行查詢。所以,Objetcs主要是Linq。 – tugberk 2012-04-04 07:19:19