2016-01-22 21 views
0

我有一個Person對象,它有一個Reports列表。如何循環多次SQL結果中的行

​​

在我的數據層中,我想使用2個SQL查詢來創建Person對象並將它們添加到列表中。我卡住的地方是 - 如何循環的次數與SQL 1的SQL結果中的行數一樣多。

每一行都應該保存爲新的Person對象並添加到列表中。

List<Person> personList = new List<Person>(); 
//SQL 1 - loop as many times as there are results, each loop adding a new Person to list 

{ 
    personList.Add(_context.Database.SqlQuery<Person>(
        @"SELECT id_txt AS IdNum 
       , lastname_txt AS LastName 
       , LOCATION_FLG AS LocFlag 
       FROM fn_PersonList(@locationId)", 
        new SqlParameter("@locId", locID) 
        ).Single()); 
} 

// second sql query to add Report list to the already created Person list 

    foreach (Person t in personList) 
    { 
     i++; 
     personList[i].Reports.Insert(i, 
     _context.Database.SqlQuery<Report>(
     @"SELECT ID_NUM 
      , RECEIVED_DTE 
      , SUBJECT_TXT           
      FROM fn_Work_Person(@pdNumber, t) 
      WHERE LocID = & locationID 
      ORDER BY ID_NUM DESC", 
      new SqlParameter("@locationId", locationID)).Single()); 
    } 
    return personList; 
+3

'_context.Database.SqlQuery ()'的返回類型是什麼?它是'List '還是'IEnumerable '?如果是這樣,你可以做'personList = _context.Database.SqlQuery (...)。ToList()'? – Quantumplate

+0

ToList是答案!謝謝Quan – Dawson

+0

你也可以嘗試使用personList.AddRange(...沒有ToList()。 –

回答

2

嘗試......

personList = _context.Database.SqlQuery<Person>(
       @"SELECT id_txt AS IdNum 
      , lastname_txt AS LastName 
      , LOCATION_FLG AS LocFlag 
      FROM fn_PersonList(@locationId)", 
       new SqlParameter("@locId", locID) 
       ).ToList(); 

類SqlQuery是可能返回IEnumerable<Person>,只需要轉換爲列表。

+0

你確實是正確的,ToList()會這樣做,謝謝。 – Dawson

0

您可以使用@@行數後SQL1獲得的行數,或者在表中創建一個自動編號字段(我將其稱爲c_Serial),並通過「輸出inserted.c_Serial」得到它,只是在後FROM子句。你會得到在兩種情況下選擇的寄存器數量。

  @"SELECT id_txt AS IdNum 
      , lastname_txt AS LastName 
      , LOCATION_FLG AS LocFlag 
      FROM fn_PersonList(@locationId) output inserted.c_serial", 
       new SqlParameter("@locId", locID) 
       ).Single()); 

或(我將使用SQL語法,因爲it's我清楚)

  Declare Counter int 

      SELECT id_txt AS IdNum 
      , lastname_txt AS LastName 
      , LOCATION_FLG AS LocFlag 
      FROM fn_PersonList(@locationId) 

      set @[email protected]@Rowcount 

好運