带列表的GroupJoin返回多个结果,而不是每个结果附加列表

时间:2018-09-17 10:32:30

标签: c# asp.net-core linq-to-sql entity-framework-core

我有疑问,我使用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 :(得分:2)

我不太确定您要使用new [] { ….. }.FirstOrDefault()来达到什么目的,也不确定如果遇到一些EF Core查询翻译错误,但是通常不尝试使用手册Join / {{ 1}},但导航属性尽可能。

通过您的实体和视图模型结构,查询看起来应该像这样:

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(取决于关系是必需的还是可选的,是内部的还是外部的)。