Конвертировать EF6 в ядро ​​EF с помощью ObjectResult - PullRequest
2 голосов
/ 24 октября 2019

У меня есть код, который я пытаюсь преобразовать. У меня больше нет этих ObjectResult и ObjectContext

Это то, что у меня было:

public virtual ObjectResult<string> GetTransData(string iN_MEM_ID)
{
    var iN_MEM_IDParameter = iN_MEM_ID != null ?
        new ObjectParameter("IN_MEM_ID", iN_MEM_ID) :
        new ObjectParameter("IN_MEM_ID", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<string>("GetTransData", iN_MEM_IDParameter);
}

Поскольку мне нужно, чтобы List был возвращен от вызывающей стороны (он отправляется обратно как jsonданные)

Это то, что я пытаюсь построить

public virtual List<string> GetTransData(string iN_MEM_ID)
    {
        var iN_MEM_IDParameter = iN_MEM_ID != null ?
               new SqlParameter("IN_MEM_ID", iN_MEM_ID) :
               new SqlParameter("IN_MEM_ID", typeof(string));

       Clinical_CaseTrakker_Context clinical = new Clinical_CaseTrakker_Context();


        List<string> offLine = clinical.string.FromSql("EXECUTE CT.GetTransData {0}", iN_MEM_IDParameter);

        return offLine;
    }

Обратите внимание, что я застрял с clinical.string Я не могу этого сделать, но я не уверен, как взять dbcontextэкземпляр и запустить FromSql для выполнения sql и возврата к списку

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

В EF Core невозможно использовать метод FromSql для возврата подмножества свойств (проекции) непосредственно из базы данных. Вам необходимо определить некоторую модель и DbSet для этого класса

public class Foo
{
   public string Bar { get; set; }
}

, затем объявить в вашем контексте

public DbSet<Foo> Foos { get; set; }

и использовать его следующим образом:

using (var context = new Clinical_CaseTrakker_Context())
{
   var offLine = context.Foos
      .FromSql("EXECUTE CT.GetTransData {0}", iN_MEM_IDParameter)
      .Select(x => x.Bar)
      .ToList();

   return offLine;
}
0 голосов
/ 24 октября 2019

Вашему контексту требуется virtual DbSet<string> ResultStrings { get; set; }, к которому вы можете обратиться и поместить результат. (Это не работает, см. этот пост или комментарий Романа Марусика ниже)

РЕДАКТИРОВАТЬ:Вашему контексту требуется virtual DbSet<ResultEntity> ResultEntities { get; set; }, к которому вы можете обратиться и поместить результат.

Затем вы можете выполнить return clinical.ResultEntities.FromSql("EXECUTE CT.GetTransData {0}", iN_MEM_IDParameter").toList(), чтобы заполнить набор.

Учитывая, что ResultEntity имеет свойства Id и value, вы можете выполнить ResultEntities.Select(e => e.value).toList(), чтобы извлечь список строк из набора.

...