2

Я разрабатываю веб-api, используя Entity Framework 6. Мне нужно выполнить сложный SQL-запрос, который получает данные из нескольких таблиц, как показано в коде. Я пробовал, но получаю следующую ошибку:Выполнение сложного необработанного SQL-запроса в EF6

The data reader has more than one field. Multiple fields are not valid for EDM primitive or enumeration types.

Запрос успешно возвращает данные в SSMS Query Analyzer.

[HttpGet] 
public IHttpActionResult getJobNo(string cmpCode, string branchCode) 
{  
    string query = string.Format(
     @"select 
      M.S1, M.S2, C.S2 As S30, M.S3, SC.S2 As S31, M.D1, M.S5, 
      JT.S2 As S32, M.S6, TM.S2 As S33, M.S10 
     from 
      MERTRM M, CMF C, CMFS SC, PMCD JT, PMCD TM 
     where 
      M.S100 = 'JOB' and M.S102 = '{0}' and 
      M.S108 = '{1}' and 
      M.S101 not in('U', 'C', 'F') and 
      M.S2 = C.S1 and C.S102 = '{0}' and 
      C.S100 = 'CC' and M.S3 = SC.S1 and SC.S102 = '{0}' and 
      C.S1 = SC.S109 and M.S5 = JT.S1 and JT.S102 = '{0}' and 
      JT.S100 = 'JTP' and M.S6 = TM.S1 and TM.S102 = '{0}' and 
      TM.S100 = 'TPM'", 
     cmpCode,branchCode); 
    var result = db.Database.SqlQuery<string>(query);    
    return Json(result.ToArray());    
} 

Поскольку запрос возвращает список записей, поэтому, когда я попытался следующим образом:

var result = db.Database.SqlQuery<IEnumerable<string>>(query).ToList(); 

Он дал мне следующую ошибку:

'System.Collections.Generic.IEnumerable`1[System.String]' may not be abstract and must include a default constructor.

Как я могу выполнить этот запрос?

С уважением!

+0

либо используйте SelectMany(), либо измените тип возвращаемого значения на класс нескольких строк. – DevilSuichiro

+0

В чем проблема с 'var result = db.Database.SqlQuery (query) .ToList();'. Параметр указывает тип строк, а не тип набора. – tschmit007

+0

@ tschmit007, Он дает ту же ошибку: «У читателя данных больше одного поля .............» –

ответ

4

вы должны использовать DAO/тип DTO:

class MyDAOType { 
    public String S1 {get; set;} 
    public String S2 {get; set;} 
    //... 
    public String S10 {get; set;} 
} 

и запрос

var result = db.Database.SqlQuery<MyDAOType>(query);  
3

Вероятно, самый простой способ определить свой собственный класс, который имеет те же поля, возвращенного SQL и использование этот класс как выход.

public class MyReport { 
    public string S1 { get; set; } 
    public string S2 { get; set; } 
    public string S30 { get; set; } 
    public string S3 { get; set; } 
    public string S2 { get; set; } 
    public string S31 { get; set; } 
    public string D1 { get; set; } 
    public string S5 { get; set; } 
    public string S32 { get; set; } 
    public string S6 { get; set; } 
    public string S33 { get; set; } 
    public string S10 { get; set; } 
} 

var result = db.Database.SqlQuery<MyReport>(query).ToList(); 
+0

Такая вещь всегда заставляет меня чувствовать, что я борюсь с каркасом. – johnny

Смежные вопросы