2013-02-18 131 views
2

實體的列表中存在的所有屬性我有以下實體:搜索如果使用LINQ

[Table("Entities")] 
public abstract class Entity { 
public int EntityID { get; set; } 
public string Description { get; set; } 
public virtual ICollection<Tag> Tags { get; set; } 
} 

和標籤實體:

public class Tag { 
    public int TagID { get; set; } 
    public int EntityID { get; set; } 
    public string TagValue { get; set; } 
} 

由於上述使得那種清晰的標籤是不重複使用作爲字符串存儲。這已經決定了實體是否共享標籤更難(更慢)。

我有一個工作搜索返回其中實體包含任何標籤的實體列表:

List<string> searchTags = new List<String> {"test1", "test2"}; 
entities = (_entityRepository.Entities 
      .Where(o=>o.Tags.Any(f=>searchTags.Contains(f.TagValue))); 

現在我還需要返回其包含的所有標籤的實體名單名單。作爲一個非屬性變量不能傳遞到一個包含方法我不能只是扭轉與所有通話的順序,但是這基本上就是我想實現:

entities = (_entityRepository.Entities 
      .Where(o=>o.Tags.All(f=>f.TagValue.Contains(searchTags))); 

我想我剛纔打在這裏我需要更正DB模式點,重新使用標籤上的標籤列表過濾我的實體時,應提供一般的性能優勢,但我還是要問以下幾個問題:

  1. 我是在這是複雜的,是否有一個簡單的Linq聲明來完成這個,或者是這樣的,或者是
  2. 這是什麼爲此我應該使用謂詞構建器來設置我的標準?

回答

1

這是可以做到這樣的:

var query = _entityRepository.Entities.Select(e => e); 
query = searchTags.Aggregate(query, (current, tag) => current.Where(e => e.Tags.Any(t => t.TagValue == tag))); 
var result = query.ToList(); 
+0

我之前,我可以充分測試做出一些改變,以我的數據模型,但是這似乎完成我是問,當我退出了我的變化以測試(我不能花很多時間在它)。謝謝 - 幫助我查找正確的東西來完成其他一些任務。 – Matthew 2013-02-19 17:31:31

+0

很高興幫助。順便說一句,回答問題2(一點):你知道System.Linq.Dynamic存在嗎?很高興使用,如果你想動態建立linq查詢 – 2013-02-19 19:15:47