提问者:小点点

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


我刚用了Fromsqlraw。在Microsoft tutorial enter link description here中,使用FromSqlRaw必须选择所有列(请注意,我还没有看到一些好的例子)。但我想要的是在连接几个表时选择一些特定的列。

首先,我连接了两个表,如下所示(RequestMaterial将Request的键作为外键):

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)被选中并报告错误(“An item with the same key has eight been added.key:RequestId'”)。

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


共2个答案

匿名用户

抱歉,当我读官方的tutiral的时候,我发现了这个

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

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

因此,目前不允许在EF.Core2.0+中使用FromSqlRaw指定列。

匿名用户

创建一个特殊的类来从SP获取数据。该类应具有select of store过程所具有的所有属性。你不需要选择所有的东西。只要选择你需要的。

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

在此之后,向dbContext DbSet添加任何键,并配置任何键,如下所示

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

这是使用store过程获取数据的示例函数


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