繁体   English   中英

如何在 EF.core 中使用 FromSqlRaw 指定列

[英]How can I specific columns using FromSqlRaw in EF.core

我刚刚使用了FromSqlRaw。 在 Microsoft 教程中,在此处输入链接描述,使用 FromSqlRaw 必须到 select 所有列(请,我还没有看到一些好的示例)。 但我想要的是 select 加入几个表时的一些特定列。

首先,我加入了如下所示的两个表(RequestMaterial 将请求的键作为外键):

var requestVm = CurrentDbContext.PmrRequest
                .FromSqlRaw("Select [r].[RequestName] from [Request] as [r] " +
                            "LEFT JOIN [RequestMaterial] as [m] On [r].RequestId = [m].RequestId " +
                            "where [r].[InitiatorUserId] = 'xxxx'")
                            .ToList();

错误消息是“底层阅读器没有预期的那么多字段”。

当我尝试 select 列而不连接表时,例如:

var requestVm = CurrentDbContext.PmrRequest
                .FromSqlRaw("Select [r].[RequestName] from [Request] as [r] " +
                            "where [r].[InitiatorUserId] = 'xxxx'")
                            .ToList();

报告相同的错误。 到目前为止,这个问题只能在我 select 的所有列时修复。 但问题是,当我使用连接表执行此操作时,选择了重复的列(RequestId)并报告了错误(“已添加具有相同键的项目。键:RequestId'”)。

有没有人有类似的经历? 或上述情况的任何解决方案?

创建一个特殊的 class 从 sp 获取数据。 这个 class 应该具有存储过程的 select 具有的所有属性。 您不需要 select 每一天。 只需 select 您需要什么。

public class ResultData
{
public string RequestName {get;set;}
public string RequestMaterial {get;set;}
.....
.....
}

在此之后添加到 dbContext DbSet 并配置没有这样的键

modelBuilder.Entity<ResultData>(e =>
        {
            e.HasNoKey();
        });

这是一个示例 function 使用存储过程获取数据


public async Task<IEnumerable<ResultData>> GetDetailsData(int id, string name)
{
    var pId = new SqlParameter("@InitiatorUserId", id);
 
    return await _context.Set<ResultData>()
             .FromSqlRaw("Execute sp_GetData  @Id ", parameters: new[] { pId })
            .ToArrayAsync();
}

如果你使用低于 3.0 的 ef core,使用 .FromSql 而不是 .FromSqlRaw

DbSet 必须包含在 model 中(即不能配置为忽略)。 map 到实体上的属性的目标表中的所有列必须包含在 SQL 语句中。 列名必须与属性映射到的那些匹配。 当结果被水合到实体的实例中时,不考虑属性名称。

如果缺少任何列,或者返回的名称未映射到属性,则会引发 InvalidOperationException 并显示以下消息:

'FromSqlRaw' 操作的结果中不存在所需的列'[第一个缺失列的名称]'。

抱歉,当我阅读官方教程时,我发现了这个

使用原始 SQL 查询时需要注意一些限制:

SQL 查询必须返回实体类型的所有属性的数据。

因此,目前,我们不允许在 EF.core 2.0+ 中使用 FromSqlRaw 指定列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM