加入内部列表

问题描述 投票:0回答:2

我有这个linq查询:

var investorData = from investor in db.Investors
                        join investorLine in db.InvestorStatementLines
                            on investor.InvestorID equals investorLine.InvestorID
                        where investor.UserId == userId
                        select new InvestorViewModel()
                        {
                            InvestorId = investor.InvestorID,
                            InvestorName = investor.Name,
                            FundingDate = investor.FundingDate,
                            DueDate = investor.DueDate,
                            FundsCommitted = investor.FundsCommitted,
                            FundsInvested = investor.FundsInvested,
                            StatementLines =
                                db.InvestorStatementLines.Where(s => s.InvestorID == investor.InvestorID)
                                    .Select(t => new InvestorStatementLineVM
                                    {
                                        Balance = t.Balance,
                                        Credit = t.Credit,
                                        Debit = t.Debit,
                                        InvestorStatementLineDetails = t.Details,
                                        Date = t.Date
                                    }).ToList()
                        };

视图模型:

public class InvestorViewModel
{
    public int InvestorId { get; set; }
    public string InvestorName { get; set; }
    public DateTime FundingDate { get; set; }
    public DateTime? DueDate { get; set; }
    public Decimal? FundsCommitted { get; set; }
    public Decimal? FundsInvested { get; set; }
    public List<InvestorStatementLineVM>  StatementLines { get; set; }
}

发生的事情是,一旦我执行查询,我就会获得125条记录,这就是该投资者的StatementLines数量。所以我得到了125条相同的记录,但我期待一个结果,它将在内部列表中包含125条语句行。

这个查询是否正确?

c# entity-framework linq linq-to-entities
2个回答
0
投票
  1. 使用GroupJoin而不是Join:(_join x in y on x.a equals y.a into z_var investorData = from investor in db.Investors join investorLine in db.InvestorStatementLines on investor.InvestorID equals investorLine.InvestorID into investorLine where investor.UserId == userId select new InvestorViewModel() { InvestorId = investor.InvestorID, InvestorName = investor.Name, FundingDate = investor.FundingDate, DueDate = investor.DueDate, FundsCommitted = investor.FundsCommitted, FundsInvested = investor.FundsInvested, StatementLines = investorLine .Select(t => new InvestorStatementLineVM { Balance = t.Balance, Credit = t.Credit, Debit = t.Debit, InvestorStatementLineDetails = t.Details, Date = t.Date }).ToList() }; 而不是执行子查询只是使用您刚刚执行的联接中的数据。
  2. 一个更好的选择,使用实体框架,使用navigation properties然后你不需要执行连接,但你只需要InvestorStatementLines作为你的investor的属性。 要设置导航属性: public class InvestorViewModel { public int InvestorId { get; set; } public string InvestorName { get; set; } public DateTime FundingDate { get; set; } public DateTime? DueDate { get; set; } public Decimal? FundsCommitted { get; set; } public Decimal? FundsInvested { get; set; } public virtual ICollection<InvestorStatementLineVM> StatementLines { get; set; } } 查询将如下所示: var investorData = from investor in db.Investors where investor.UserId == userId select new InvestorViewModel() { InvestorId = investor.InvestorID, .... StatementLines = investor.InvestorStatementLines.Select(....) };

2
投票

这是您使用导航属性执行此操作的方法

var investorData = from investor in db.Investors
                   where investor.UserId == userId
                   select new InvestorViewModel()
                   {
                       InvestorId = investor.InvestorID,
                       InvestorName = investor.Name,
                       FundingDate = investor.FundingDate,
                       DueDate = investor.DueDate,
                       FundsCommitted = investor.FundsCommitted,
                       FundsInvested = investor.FundsInvested,
                       StatementLines = investor.InvestorStatementLines
                           .Select(t => new InvestorStatementLineVM
                           {
                               Balance = t.Balance,
                               Credit = t.Credit,
                               Debit = t.Debit,
                               InvestorStatementLineDetails = t.Details,
                               Date = t.Date
                           }).ToList()
                   };
© www.soinside.com 2019 - 2024. All rights reserved.