2016-10-05 5 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() 
         }; 

модель представление:

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 строк операторов во внутреннем списке.

Вы думаете, что вопрос правильный?

Спасибо, Лацьале

+1

Почему вы делаете соединение, а затем подзапрос в basi Получают одинаковые данные? Либо удалите соединение, либо выполните группу и удалите внутренний запрос. Или еще лучше использовать свойства навигации вместо https://coding.abel.nu/2012/06/dont-use-linqs-join-navigate/ – juharr

+0

@juharr, как бы вы переделали этот запрос с помощью свойств навигации, можете ли вы поместить это в ответ? Спасибо – Laziale

+0

Какой «один результат» вы хотите получить? Первое утверждение, последнее, количество всех утверждений или что-то еще? – 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 и тогда вам не нужно выполнять объединение, но вы просто 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(....) 
            }; 
    
+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() 
        }; 
Смежные вопросы