Я видел несколько ответов на подобные вопросы, однако я не могу понять, как применить ответ на мою проблему.Условное включение() в инфраструктуре Entity
var allposts = _context.Posts
.Include(p => p.Comments)
.Include(aa => aa.Attachments)
.Include(a => a.PostAuthor)
.Where(t => t.PostAuthor.Id == postAuthorId).ToList();
Вложения могут быть загружены Автором (Тип Автор) или Участником (введите Contributor). То, что я хочу сделать, - это получить только вложения, в которых владелец приложения имеет тип Author.
Я знаю, что это не работает и выдает ошибку:
.Include(s=>aa.Attachments.Where(o=>o.Owner is Author))
Я читал о отфильтрованных спроецированных здесь
EDIT - ссылка на статью: : http://blogs.msdn.com/b/alexj/archive/2009/10/13/tip-37-how-to-do-a-conditional-include.aspx,
но Я просто не могу обойти его.
Я не хочу включать фильтр в final where, поскольку я хочу ВСЕ сообщения, но я хочу только получить вложения для тех сообщений, которые принадлежат автору.
EDIT 2: - Сообщение схемы просил
public abstract class Post : IPostable
{
[Key]
public int Id { get; set; }
[Required]
public DateTime PublishDate { get; set; }
[Required]
public String Title { get; set; }
[Required]
public String Description { get; set; }
public Person PostAuthor { get; set; }
public virtual ICollection<Attachment> Attachments { get; set; }
public List<Comment> Comments { get; set; }
}
Не могли бы вы показать нам схему «Сообщений», пожалуйста? – DarkKnight
@DarkKnight - см. Редактировать – grayson
@grayson То, что вы просите сделать, невозможно. 'Linq2Sql' преобразует ваш код в raw' SQL', и он будет возвращать дочерние строки через соединение. Вы не можете выполнить это условное соединение в 'SQL'. Единственным вариантом является удаление '.Include (aa => aa.Attachments)' и второй запрос, который возвращает вложения в зависимости от того, является ли владелец автором/вкладчиком. – Rob