繁体   English   中英

如何使用 Entity Framework Core 5 中的自定义列进行 SQL 查询

[英]How to make an SQL query with custom columns in Entity Framework Core 5

我有一些这样的表:

CREATE TABLE names (
    score   INTEGER NOT NULL PRIMARY KEY,
    name    TEXT NOT NULL
);

我想从中得到一些统计数据。 在 sqlite 中,我可以使用 LEAD,但不能在那里使用。 我现在关于linq2db ,但我不想使用它,因为它的算法。 据我了解,这个包并没有在EF linq中将LEAD模板添加到SQL转换中,而是在自己端执行LEAD算法(不是在数据库端,这样效率更高)。 如果我错了,请纠正我。

例如,我想执行查询:

var lst = db.table_names.FromSqlRaw("SELECT score, LEAD(cid, 1) OVER (ORDER BY score) as next, LEAD(score, 1) OVER (ORDER BY score) - score AS diff FROM names ORDER BY diff DESC LIMIT 1");

此 SQL 表达式返回它们之间差距最大的两个分数。 执行查询并返回单行(从 lst.Count() 和调试器已知)。

结果就在那里,但我如何得到它? 也许 EF 的某些功能允许从自定义 SQL 格式的数据结构中合法获取数据?

我不想把拐杖用我需要传输到代码的数据填充到类结构中,但从类字段的目的来看是不正确的。

也许有非法的,但比我上面给出的方法更不重要的方法?

您有两种方法可以解决这个问题。

  1. 使用您拥有的查询在数据库级别创建一个视图并在实体框架中使用它,然后您将能够简单地执行以下操作
var lst = db.vw_name.OrderBy(d => d.diff).ToList();
  1. 改用LINQ 查询语法,但您需要编写多个查询并将它们连接在一起,以及创建一个新类,该查询可用于实例化其对象列表。 这是一个不包含 SQL 函数的简化示例
public class Scores {
    public int Score { get; set; }
    public int Next { get; set; }
    public int Max { get; set; }
}

var lst = (from x in db.table_names
           orderby x.diff
           select new Scores {
               Score = x.score,
               Next = x.next,
               Max = x.Max
          }).ToList();

在我看来,出于多种原因,前一种方法要好得多。

除了巴塞尔 Ashi 的回答

使用您拥有的查询在数据库级别创建一个视图并在实体框架中使用它

在数据库级别创建视图:

db.Database.ExecuteSqlRaw(@"CREATE VIEW View_scoreDiff AS SELECT score, LEAD(cid, 1) OVER (ORDER BY score) as next, LEAD(score, 1) OVER (ORDER BY score) - score AS diff FROM names ORDER BY diff DESC LIMIT 1");

然后你需要创建一个类:

public class View_scoreDiffClass {
    public int Score { get; private set; }
    public int Next { get; private set; }
    public int Diff { get; private set; }
}

将下一个字段添加到您的上下文中:

public DbSet<View_scoreDiffClass> View_scoreDiff { get; private set; }

OnModelCreating添加到OnModelCreating

modelBuilder.Entity<View_scoreDiffClass>().ToView("View_scoreDiff").HasNoKey();

毕竟,您可以执行db.View_scoreDiff.FirstOrDefault()并获得所需的列。

暂无
暂无

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

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