当前位置: 首页 > 知识库问答 >
问题:

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

祝宏放
2023-03-14

我刚用了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个答案

杨高翰
2023-03-14

创建一个特殊的类来从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

怀晋
2023-03-14

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

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

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

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

 类似资料:
  • 问题内容: 我知道Java没有指针,但是我听说可以用指针创建Java程序,而这可由少数Java专家来完成。是真的吗 问题答案: Java中的所有对象都是引用,你可以像使用指针一样使用它们。 取消引用null: 混叠问题: 丢失的细胞: 你可以通过首先确保不再需要第二个旧值或为另一个指针分配第二个值来确保此安全。 请注意,以其他方式给second赋值(NULL,new …)同样可能引起错误,并可能导

  • 我在redis stream文档中看到了这一点,它说: 是时候试着用消费者群体来阅读一些东西了: XREADGROUP回复与XREAD回复一样。请注意,尽管上面提供了一个组,但它声明我希望使用消费者组mygroup从流中读取数据,我是消费者Alice。每次使用者对使用者组执行操作时,都必须指定其名称,以便在组内唯一标识此使用者。 在上面的命令行中还有另一个非常重要的细节,在强制流选项之后,为密钥m

  • 问题内容: 当前正在检索机器上安装的默认打印机以进行打印。我希望能够选择文档要使用的打印机。最好的方法是什么? 码: 问题答案: 在下面创建类,将其导入,然后在知道打印机名称的情况下尝试调用;如果您不知道可以访问哪些打印机,请调用一个包含所有可行的注册打印机名称的。 也可以查看我对这个SO问题的答案以获取更多详细信息:

  • 我想截屏Selenium中的一个元素,根据文档,每个WebElement都有一个功能: 截图(文件名) 将当前元素的屏幕截图保存到PNG图像文件。如果有任何IOError,则返回False,否则返回True。在文件名中使用完整路径。 Args:filename:您希望将屏幕截图保存到的完整路径。这应该以一个简单的结尾。png扩展 用法:元素。截图(“/Screenshots/foo.png”) 但

  • 我的代码如下。我正在使用spring boot与jpa和postgresql数据库,我需要用户友好的名称作为外键。 我使用@foreignkey注释给出了foreignkey的名称,但当我看到db时,它显示的是随机创建的foreignkey名称。 我需要像注释中提到的fk_program_id和fk_course_id那样的外键。 提前道谢。

  • 我正在使用ApachePOI将数据写入Excel文件,我希望第一行为只读,其他行可以随时编辑。但我没有找到有效的解决方法。 下面是我的代码: 看起来这个java代码块应该可以工作,但实际上它不仅会锁定第一行,还会锁定其他行的空单元格。 所以我想知道,有没有一种有效的方法可以使用apachepoi只锁定excel文件的第一行?