2009-05-18 85 views
0

我有經典的3表 - 實體,標籤和entitytag - 數據庫結構。Linqtosql - 查找與查詢中所有標籤匹配的所有實體

爲了找到標有我使用下面的Linqtosql某些代碼標籤的所有實體:

string[] myTags = {"tag1","tag2"}; 

var query = from m in entity 
      where m.entitytag.Where(c => myTags.Contains(c.tag.TagName)).Count() == myTags.Count() 
      select m; 

然而,當實體有重複的標籤(有這個正當的理由在我真正的應用程序)的查詢返回不匹配所有標籤的實體。

例如,在上面的代碼示例中,如果一個實體被標記了兩次'tag1'而不是'tag2',它將返回結果,儘管不匹配兩個標記。

我不知道如何從結果中排除這些實體?

還是有一個完全不同的方法,我應該採取?

回答

0

正如約恩建議,鮮明的()需要被使用,但它並沒有對整個entitytag臺工作。這裏使用另一個Select語句來比較實際的標籤。

string[] myTags = {"tag1","tag2"}; 

    var query = from m in entity 
    where m.entitytag.Select(et => et.tag.TagName).Distinct().Where(c => myTags.Contains(c)).Count() == myTags.Count() 
    select m; 

不幸的是,這樣做的缺點是這會使性能受到一些損害。

0

如何將其更改爲

where m.entitytag.Distinct().Where(c => ... 

從實體對象的子集,將刪除重複entitytags,並讓您的計數正常工作

+0

我已經嘗試過,但它仍然返回重複的條目。 – 2009-05-18 07:56:10

+0

在Distinct完成此項工作之前添加Select(et => et.tag.TagName)。看到我對這個問題的回答... – 2009-05-18 15:12:12

1

試試這個查詢,而不是:

    string[] myTags = { "tag1", "tag2" }; 
        var query = from m in entity 
           where myTags.All(tag => m.entitytag.Contains(tag)) 
           select m; 
        query.Dump(); 

所有擴展方法都是確保每個標籤都符合包含條件。

對於只需滿足一個條件的情況,也有任何擴展方法。

希望它有幫助。

卡萬

+0

這是無效的。 where子句中的'tag'是string類型而不是entitytag。 – 2009-05-18 08:07:27

0

嘗試

string[] myTags = { "tag1", "tag2" }; 

var query = from e in entity 
      where !myTags.Except(from e.tag select e.tag.TagName).Any() 
      select e; 

的想法是從myTags的副本中刪除實體的標籤。之後留下的任何元素都與實體中缺少的標籤相對應。

我不知道這是如何執行,但。

相關問題