GroupJoin со списком возвращает несколько результатов вместо прикрепления списка к результату - PullRequest
0 голосов
/ 17 сентября 2018

Я запросил, что я использую GroupJoin для списка элементов (родительский элемент) и GroupJoin для списка элементов (первый дочерний элемент) для второго списка (второй дочерний элемент), который имеет fk для первого дочернего элемента.При получении списка для каждого элемента (родительского элемента) я получаю по одному m элементу (поэтому необходимо получить один результат с помощью списка элементов, каждый из которых («отец») встречается несколько раз с одним («первым дочерним элементом»).") результат.

Надеюсь, код объяснит лучше.

Модель объекта:

public class QuettaReq
{
    public QuettaReq()
    {
    }

    [Key] public int             Id   { get; set; }
    public       ApplicationUser User { get; set; }

    public Category Category { get; set; }

    public int CatId { get; set; }
    //Parameters 

    public virtual List<QuettaOffer>   QuettaOffer    { get; set; }
    public virtual List<QuoteQuestion> QuoteQuestions { get; set; }
}

public class QuoteQuestion
{
    [Key] public int QuoteQuestionId { get; set; }

    public int       QuoteId   { get; set; }
    public QuettaReq QuettaReq { get; set; }

    public string         Question { get; set; }
    public IList<Answers> Answers  { get; set; }
}

Просмотр модели:

public class ReqestWithQA
{
    [Key] public int Id { get; set; }

    //public ApplicationUser User { get; set; }
    public string SiteUserId { get; set; }

    //properties
    public virtual IList<QAViewModel> QAViewModel { get; set; }
    public         int                QuettaReqId { get; set; }
}

public class QAViewModel
{
    public int    QuoteQuestionId { get; set; }
    public int    QuoteId         { get; set; }
    public string Question        { get; set; }

    public IList<Answers> Answers { get; set; }
}

Запрос:

IQueryable<ReqestWithQA> viewModel = _context.Quetta
        .Include(q => q.Category)
        .Where(d => d.OfferDate > DateTime.Now && d.CatId == suplayerCat)
        .Where(rq => !postOn.Contains(rq.Id))
        .GroupJoin(
            _context.quoteQuestions.Include(t => t.Answers),
            quetta => quetta.Id,
            qestion => qestion.QuoteId,
            (quetta, joinQestionQuetta) => new ReqestWithQA
            {
                ReqText         = quetta.ReqText,
                Qentity         = quetta.Qentity,
                CatId           = quetta.CatId,
                CatName         = quetta.Category.CatName,
                District        = quetta.District,
                ApplicationDate = quetta.ApplicationDate,
                DeliveryDate    = quetta.DeliveryDate,
                OfferDate       = quetta.OfferDate,
                TecnicalDetails = quetta.TecnicalDetails,
                Bedget          = quetta.Bedget,
                Id              = quetta.Id,
                QAViewModel = new[] {
                    joinQestionQuetta
                        .Select(q => new QAViewModel
                        {
                            Question = q.Question, //there are 6 question
                            Answers  = q.Answers,
                            QuoteId  = q.QuoteId

                        })
                        .FirstOrDefault()
                }
            });

return View(viewModel.Distinct().ToList()); //viewModel results are 6 Should be 1 with 6 Q

Я думаю, что проблема в массиве, но я понятия не имею, что вместо этого использовать:

QAViewModel = new[] {
    joinQestionQuetta
        .Select(q => new QAViewModel

1 Ответ

0 голосов
/ 17 сентября 2018

Я не совсем уверен, чего вы пытаетесь достичь с помощью new [] { ….. }.FirstOrDefault(), а также если вы сталкиваетесь с какой-то ошибкой перевода запросов EF Core, но в целом старайтесь не использовать ручную Join / GroupJoin, а используйте навигациюсвойства, где это возможно.

С вашей структурой моделей сущностей и представлений запрос выглядит примерно так:

var query = _context.Quetta
    .Include(qr => qr.Category) // Not needed, will be ignored
    .Where(qr => qr.OfferDate > DateTime.Now && qr.CatId == suplayerCat)
    .Where(qr => !postOn.Contains(qr.Id))
    .Select(qr => new ReqestWithQA
    {
        ReqText = qr.ReqText,
        Qentity = qr.Qentity,
        CatId = qr.CatId,
        CatName = qr.Category.CatName,
        District = qr.District,
        ApplicationDate = qr.ApplicationDate,
        DeliveryDate = qr.DeliveryDate,
        OfferDate = qr.OfferDate,
        TecnicalDetails = qr.TecnicalDetails,
        Bedget = qr.Bedget,
        Id = qr.Id,
        QAViewModel = qr.QuoteQuestions
            .Select(qq => new QAViewModel
            {
                QuoteQuestionId = qq.QuoteQuestionId,
                QuoteId = qq.QuoteId,
                Question = qq.Question,
                Answers = qq.Answers,
            })
            .ToList()
    });

var result = query.ToList();

Свойства навигации по коллекции действуют как GroupJoin, ссылки на свойства навигации- как Join (либо внутреннее, либо левое внешнее в зависимости от того, является ли отношение обязательным или необязательным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...