【问题标题】:.Net Core EntitiyFramework Top Row Of Joined Table.Net Core EntityFramework 连接表的顶行
【发布时间】:2021-10-16 14:38:36
【问题描述】:

我正在尝试从数据库中获取所有学生最后参加的课程。我写了 tsql 代码,它工作得很好,但是我不能在实体框架核心上做同样的事情。

下面的代码对我有用。

select a.student, b.class, b.attend from students a inner join class b on b.id = (
select top 1 id
from class
where student = a.student order by attend desc
)

这也是我编写 EF 查询的尝试。

datavalue = db.students.join(
db.class, m => m.student,
s => s.student, (m, s) => new joinedstudentswclass { class = s.class, student = m.student }
).tolist();

【问题讨论】:

    标签: asp.net-core .net-core entity-framework-core


    【解决方案1】:

    你应该使用 firstOrDefault 来获取一条记录。

    如果你想订购一些东西,你应该使用 orderBy 方法。

    .OrderBy(x => x.City) for ascending students
    .OrderByDescending(x => x.City) for descending students
    

    代码应该是这样的

     OrderByDescending(x=>x.Students).FirstOrDefault();
    

    【讨论】:

    • 它给出了类似“错误 CS0029 无法将类型 'iot.Models.Joinedstudentswclass' 隐式转换为 'System.Collections.Generic.List'”的错误”
    • 你能把变量改成var吗?
    • 好吧,我把它改成 var。现在“无法翻译。要么以可翻译的形式重写查询,要么通过插入对‘AsEnumerable’、‘AsAsyncEnumerable’、‘ToList’或‘ToListAsync’的调用显式切换到客户端评估”
    • 你的 ef/core 版本是什么?
    • .net core 3.1 和 ef 5.0.9
    【解决方案2】:

    没有导航属性:

    var query = 
       from s in db.students
       from c in db.Where(c => c.student == s.student).OrderByDescending(c => c.attend).Take(1)
       select new joinedstudentswclass 
       { 
          class = c, 
          student = s 
       };
    
    var datavalue = query.ToList()
    

    如果您在student 类中有导航属性Classes

    var query = 
       from s in db.students
       from c in s.Classes.OrderByDescending(c => c.attend).Take(1)
       select new joinedstudentswclass 
       { 
          class = c, 
          student = s 
       };
    
    var datavalue = query.ToList()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 2020-08-17
      • 2017-11-15
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多