为了账号安全,请及时绑定邮箱和手机立即绑定

没有DbSet的原始SQL查询-实体框架核心

没有DbSet的原始SQL查询-实体框架核心

C#
慕的地6264312 2019-10-18 11:12:35
删除Entity Framework Core后,dbData.Database.SqlQuery<SomeModel>我找不到为我的全文搜索查询构建原始SQL查询的解决方案,该查询将返回表数据以及排名。我看到的在Entity Framework Core中构建原始SQL查询的唯一方法是通过dbData.Product.FromSql("SQL SCRIPT");,它没有用,因为我没有DbSet可以映射在查询中返回的排名。有任何想法吗???
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

如果您使用的是自2018年5月7日起可用的EF Core 2.1 Release Candidate 1,则可以利用建议的新功能(查询类型)。


什么是查询类型?


除实体类型外,EF Core模型还可包含查询类型,该查询类型可用于对未映射到实体类型的数据执行数据库查询。


什么时候使用查询类型?


用作临时FromSql()查询的返回类型。


映射到数据库视图。


映射到未定义主键的表。


映射到模型中定义的查询。


因此,您不再需要进行建议作为问题答案的所有技巧或变通方法。只需按照以下步骤操作:


首先,您定义一个新的type属性,DbQuery<T>其中Ttype是将携带SQL查询的列值的类的类型。因此,您DbContext将拥有:


public DbQuery<SomeModel> SomeModels { get; set; }

其次,使用FromSql与您类似的方法DbSet<T>:


var result = context.SomeModels.FromSql("SQL_SCRIPT").ToList();

var result = await context.SomeModels.FromSql("SQL_SCRIPT").ToListAsync();

还要注意,DBContext是局部类,因此您可以创建一个或多个单独的文件来组织“ raw SQL DbQuery”定义,以使其最适合您。


查看完整回答
反对 回复 2019-10-18
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

在EF Core中,您不再可以执行“免费”原始sql。您需要定义POCO类和DbSet该类的。在您的情况下,您需要定义Rank:


var ranks = DbContext.Ranks

   .FromSql("SQL_SCRIPT OR STORED_PROCEDURE @p0,@p1,...etc", parameters)

   .AsNoTracking().ToList();

由于肯定是只读的,因此包含该.AsNoTracking()调用将很有用。


查看完整回答
反对 回复 2019-10-18
  • 3 回答
  • 0 关注
  • 692 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信