2016-10-05 13 views
0

内側のリストに参加:私はこの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() 
         }; 

のviewmodel:

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件のレコードを取得していますクエリを実行していたらある、とのthatsその投資家のStatementLinesの数。だから私は125の同じレコードを取得していますが、内側のリストに125文の行がある1つの結果を期待しています。

あなたはその質問が正しいと思いますか?

おかげで、Laziale

+1

なぜあなたはjoinをしてからbasiへのサブクエリをしていますか? callyは同じデータを取得しますか?結合を削除するか、内部クエリを使用してグループを作成して削除します。または、代わりにナビゲーションプロパティを代わりに使用することをお勧めします。https://coding.abel.nu/2012/06/dont-use-linqs-join-navigate/ – juharr

+0

@juharrナビゲーションプロパティでこのクエリをやり直す方法はありますか?答え?ありがとう – Laziale

+0

「1つの結果」を取得しますか?最初のステートメント、最後のステートメント、すべてのステートメントのカウント、または何か他のステートメント? – JohnH

答えて

0
  1. 利用GroupJoin代わりの参加:(_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を使用していると、あなたは、結合を実行する必要はありませんが、あなたは自分のinvestorのプロパティとして InvestorStatementLinesを持っています。

    設定するには、ナビゲーションプロパティ:

    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(....) 
            }; 
    
+0

ありがとう、それは動作します – Laziale

+0

@Laziale - ナビゲーションプロパティの更新を参照してください –

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() 
        }; 
関連する問題