2016-08-14 2 views
1

У меня есть, может быть, немного неловко - вопрос, на который я не могу понять ответ. У меня есть следующие объекты:Как фильтровать несколькими связанными объектами в 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; } 
} 

Я установил связь быть много-ко-многим с помощью текучего 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

Я принимаю теги - это список 'Tag'? если да, это проблема – Balah

ответ

1

Похоже, вы пытаетесь использовать теги в виде списка Tag в своем запросе. .Contains() не будет работать с классами, поскольку они не являются константами. Преобразуйте tags в список Guid (так как вы проверяете Id). то есть

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

Для обеспечения производительности вы можете поместить индексы в таблицы. Это мои 2 цента. Сегодня может быть лучше, но в прошлом это было хорошо для меня.

+0

Спасибо, но, к сожалению, она не работает, я получаю то же исключение (что понятно, потому что 'Guid' не является примитивным типом). –

+0

Хорошо, что это удивительно (я сделал это как раз на днях). Можете ли вы обновить вопрос, как вы определили «теги»? – Balah

+0

Я выделил проблему в отдельном решении, и ваше решение сработало. Исключение было совершенно не связано с ним. Спасибо за вашу помощь! –

Смежные вопросы