2016-08-14 15 views
1

私は答えが分かりませんが、おそらく少し恥ずかしい質問があります。私は多対多の流暢API使用する関係を構成しEntity Frameworkで複数の関連エンティティをフィルタリングする方法

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; } 
} 

:私は、次のエンティティを持っている

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

を私はタグのリストで記事をフィルタリングする(だけのリターン指定されたすべてのタグを持つ記事):

tagsは、ユーザーが指定したタグのリストであり、私の Tagエンティティがに上書きその Equalsメソッドを持ってい
context.Posts.Where(p => p.Tags.Any(t => tags.Contains(t))) 

Idプロパティに基づいている必要があります。私は、クエリを実行したときしかし、私は取得NotSupportedException

型「System.NotSupportedException」の例外がEntityFramework.SqlServer.dllで発生したが、ユーザーコードで

追加情報は処理されませんでした。作成できませんが'Plog.Domain.Plog.Tag'型の定数値です。このコンテキストでは、プリミティブ型または列挙型のみがサポートされています。

どのようにすれば合理的なパフォーマンスが得られますか?

+0

私はtagsが 'Tag'のリストであると仮定していますか?そうであれば、それは問題です – Balah

答えて

1

あなたの質問にTagのリストとしてタグを使用しようとしているようです。 .Contains()はクラスでは定数ではないため動作しません。 tagsGuidのリストに変換してください(Idをチェックしているため)。すなわち

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

パフォーマンスを向上させるために、テーブルにインデックスを付けることができます。それは私の2セントです。今日はもっと良い方法かもしれませんが、上記は私のために過去にはうまくいきました。

+0

ありがとうございますが、残念ながらそれはうまくいきません。同じ例外があります(これは 'Guid'がプリミティブ型ではないため理解できます)。 –

+0

それは驚くべきことです(私はその日のようにそれをしました)。 'tags'の定義方法で質問を更新できますか? – Balah

+0

問題を別のソリューションで分離し、ソリューションが機能しました。例外は完全に無関係でした。ご協力いただきありがとうございます! –