首页>Program>source

我有一些这样的桌子:

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格式的数据结构中获取数据?

我不想拐弯抹角地用需要传输到代码的数据填充类结构,但是从类字段的目的出发,这是不正确的。

也许有非法的方法,但是比我上面给出的方法要残酷得多?

最新回答
  • 7天前
    1 #

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

    使用您拥有的查询在数据库级别创建一个视图并在实体框架中使用它,那么您将能够简单地执行以下操作

    var lst = db.vw_name.OrderBy(d => d.diff).ToList();
    

    改为使用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();
    

    我认为,出于多种原因,前一种方法要好得多。

  • 7天前
    2 #

    Bassel Ashi的补充回答:

    Create a view on the database level with the query you have and use it in the entity framework

    在数据库级别创建视图:

    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

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

    所有这些之后,您可以执行 db.View_scoreDiff.FirstOrDefault() 并获得所需的列。

  • algorithm:找到这样的方式,使最大跳跃距离最小
  • android:为什么使用Xamarin Forms的iOS应用程序无法显示"真棒字体"?