使用 ObjectResult 将 EF6 转换为 EF 核心

Convert EF6 to EF core with the ObjectResult

我有一些代码正在尝试转换。我不再有这些 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);
}

因为我需要从调用者那里 return 编辑列表(它作为 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 和 return 列表

您的上下文需要一个 virtual DbSet<string> ResultStrings { get; set; },您可以调用它并将结果放入其中。(这不起作用,请参阅下面的 this post 或 Roman Marusyk 评论)

编辑:您的上下文需要一个 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() 从集合中提取字符串列表。

在 EF Core 中,无法使用 FromSql 方法直接从数据库 return 属性子集(投影)。 您需要为 class

定义一些模型和 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;
}