Во-первых, здесь помогут свойства навигации. EF может отобразить отношения и составить SQL, вместо того, чтобы пытаться преобразовать LINQ в SQL.
Если отношения между News и NewsImage отображаются там, где News содержит:
Внутри класса News:
public virtual ICollection<NewsImage> NewsImages { get; set; } = new List<NewsImage>();
Внутри класса NewsImage:
public virtual News News { get; set; }
Если ваш NewsImage также содержит свойство NewsGuid, то это может быть связано к свойству навигации по новостям:
[ForeignKey("News")]
public Guid NewsGuid { get; set; }
Наконец, отображение. Это можно сделать с помощью определения EntityTypeMapping, которое EF может загрузить, чтобы понять взаимосвязь между сущностями, или с помощью события OnModelCreating
и его modelBuilder в DbContext. С modelBuilder это будет выглядеть примерно так:
public override OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<News>().HasMany(x => x.NewsImages).WithRequired(x => x.News);
}
Запрос контроллера будет выглядеть примерно так:
newsDate = newsDate.Date;
var cutOff = newsDate.AddDays(1);
var news = db.News
.Where(n => n.NewsDate >= newsDate && n.NewsDate < cutOff);
Это даст вам новости за указанную дату. Появляется вторая часть, в которой вы хотите отфильтровать только изображения для любых статей (если таковые имеются), которые соответствуют критериям, но по-прежнему отображать элемент списка новостей, если нет изображений.
var newsListItems = db.News
.Where(n => n.NewsDate >= newsDate && n.NewsDate < cutOff)
.SelectMany(n => n.NewsImages
.Where(ni => ni.FileOrder == 10)
.Select(ni => new NewsList
{
NewsGuid = n.NewsGuid,
Heading = n.Heading,
FileName = ni.FileName
})).OrderByDescending(n => n.NewsDate)
.Take(10).ToList();
Это доставит вас туда, где вы сейчас находитесь, но включит в себя только новости с изображениями.
Чтобы включить Новости без изображений:
var newsListItems = db.News
.Where(n => n.NewsDate >= newsDate && n.NewsDate < cutOff)
.SelectMany(n => n.NewsImages
.Where(ni => ni.FileOrder == 10)
.Select(ni => new NewsList
{
NewsGuid = n.NewsGuid,
Heading = n.Heading,
FileName = ni.FileName
}))
.Union( db.News
.Where(n => n.NewsDate >= newsDate && n.NewsDate < cutOff
&& !n.NewsImages.Any(ni => ni.FileOrder == 10)
.Select(n => new NewsList
{
NewsGuild = n.NewsGuid,
Heading = n.Heading
}))
.OrderByDescending(n => n.NewsDate)
.Take(10).ToList();
... И я считаю, что это должно вернуть вам то, что вы ожидаете ... Список новостей с или без изображений для день, упорядоченный по дате / времени. Отказ от ответственности, что это написано из памяти и может иметь некоторые ошибки в Linq, но это должно быть довольно близко.
- Редактировать: я не могу не думать, что это может быть сделано без
Union
, хотя ...:)