Получить данные с помощью запроса LINQ с левым соединением и AsExpandable () - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть две таблицы: изображения и статьи

Обе таблицы связаны столбцом ImageId.

Изображение может быть связано с несколькими статьями.

Например: таблица изображений содержит 100 строк, а таблица статей - 200 строк.

Из этих 100 изображений предполагается, что только 90 используются в статьях.В этом случае некоторые изображения повторяются во многих статьях.

Здесь я хочу получить неиспользуемые 10 изображений (из таблицы изображений), а также включить те, которые связаны со статьями не более 2 раз,Я хочу игнорировать те изображения, которые связаны со статьями более 2 раз.

Я пробовал следующий запрос linq, но он не работает для меня.

 var predicate = PredicateBuilder.True<Image>();
                if (type != null && type != 0)
                {
                    predicate = predicate.And(c => c.ImageType == type);
                }
                if (!string.IsNullOrWhiteSpace(keyword))
                {
                    predicate = predicate.And(c => c.Name.Contains(keyword) || c.Keyword.Contains(keyword));
                }

                int skip = numberofImages * (page - 1);

var images = (from imgs in context.Images
                              join art in context.Articles on imgs.ImageId equals art.ImageId into unusedImages
                              from img in unusedImages.DefaultIfEmpty()
                              group img by imgs.ImageId into grouped                              
                                   .AsExpandable()
                                   .Where(predicate)
                              orderby Guid.NewGuid(), imgs.ImageId descending
                              select imgs)
                                   .Skip(skip).Take(numberofImages).ToList();

enter image description here

Может ли кто-нибудь помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 18 июля 2019

разделите ваш запрос примерно так, я не буду усложнять то, что предпочтительно просто

var usedArticles = (from item in  context.Articles
                    group item by imageid into newList
                    select new 
                      { 
                       imageid = newList.key,
                       count =newlist.count
                       }).ToList();  
var unwaantedImageIds = usedArticles.where(x=>x.count>2).Select(y=>y.imageId).ToArray();

   var unwantedImages =context.image.where(x=>unwaantedImageIds.contains(x.imageId));
    var result =  context.images.Except(unwaantedImageIds).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...