-1

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

首先,我加入了如下所示的两个表(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();

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

当我尝试选择一列而不加入表时,例如:

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

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

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

4

2 回答 2

0

创建一个特殊的类来从 sp 获取数据。此类应具有存储过程选择所具有的所有属性。你不需要选择everytning。只需选择您需要的。

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

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

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

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


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();
}

如果您使用 ef core 小于 3.0 ,请使用 .FromSql 而不是 .FromSqlRaw

于 2021-03-15T15:07:44.523 回答
-1

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

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

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

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

于 2021-03-15T15:07:16.297 回答