2016-08-14 51 views
1

我有一個 - 也許有點尷尬 - 問題,我無法找出答案。我有以下實體:如何在實體框架中由多個相關實體過濾

public class Post 
{ 
    public Guid Id { get; set; } 
    public string Text { get; set; } 
    public virtual ICollection<Tag> Tags { get; set; } 
} 

public class Tag 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

我配置的關係是許多一對多使用流利的API:

modelBuilder.Entity<Post>() 
    .HasMany(p => p.Tags) 
    .WithMany() 
    .Map(m => 
    { 
     m.MapLeftKey("PostId"); 
     m.MapRightKey("TagId"); 
     m.ToTable("PostTags"); 
    }); 

我想,以濾除(標籤列表僅返回崗位

context.Posts.Where(p => p.Tags.Any(t => tags.Contains(t))) 

哪裏tags是用戶指定的標籤的列表和我Tag實體都有Equals方法覆蓋到:有指定的所有標籤)的帖子基於Id屬性。但是,當我運行查詢,我收到了NotSupportedException

「System.NotSupportedException」類型的異常出現在EntityFramework.SqlServer.dll但在用戶代碼中沒有處理

其他信息:無法創建類型爲「Plog.Domain.Plog.Tag」的常量值。只有原始類型或枚舉類型在此上下文中受支持。

我怎樣才能使這項工作的方式也是合理的表現?

+0

我假設標籤是一個'標籤'列表?如果是這樣,這就是問題 – Balah

回答

1

它看起來像你試圖在你的查詢中使用標籤作爲Tag的列表。 .Contains()將不能用於類,因爲它們不是常量。將tags轉換爲Guid的列表(因爲您正在查看Id)。即

context.Posts.Where(p => p.Tags.Any(t => tags.Contains(t.Id))) 

對於性能,你可以把索引放在表上。這是我的2美分。今天可能會是更好的方式,但上述過去對我來說確實很好。

+0

謝謝,但不幸的是它不起作用,我得到了同樣的異常(這是可以理解的,因爲'Guid'不是一個原始類型)。 –

+0

好吧,這是令人驚訝的(我這樣做就像那一天)。你可以用你如何定義'tags'來更新這個問題嗎? – Balah

+0

我在單獨的解決方案中隔離了問題,並且解決方案正常工作。這個例外與它完全無關。謝謝你的幫助! –

相關問題