根据其他上下文排序

本文关键字:排序 上下文 其他 | 更新日期: 2023-09-27 17:58:29

我遇到了一些奇怪的情况(可能只有我自己才奇怪!)。

我有一些类似StudentMerit的桌子。它具有列StudentIdMarks。还有另一个名为StudentDetails的表,它具有StudentIdStudentName

我需要像一样查询它

select a.StudentId, a.Marks, b.StudentName 
from StudentMerit a, StudentDetails b 
where a.StudentId = b.StudentId 
order by StudentName ASC, Marks DESC

我现在使用Telerik ORM进行数据访问,我需要将查询的输出作为类类型StudentMerit。所以我不能像这样直接将上面的查询转换为Linq:

var query = context.StudentMerit
    .SelectMany(
        r => context.StudentDetails
            .Where(rp => rp.StudentId==.StudentId)
            .DefaultIfEmpty(),
        (r,rp) => new
                  {
                      r.StudentId,
                      r.Marks,
                      rp.StudentName 
                  })
    .OrderBy(c=>c.StudentName)
    .ThenByDescending(c=> c.Marks);       

因为它以匿名类型的形式返回输出。我在选择查询中不需要StudentName,但需要它对查询进行排序。

有没有什么方法可以在不连接表的情况下直接基于StudentName进行排序?

请帮帮我。

根据其他上下文排序

您可以使用以下连接简化查询:

var query = from m in context.StudentMerit
            join s in context.StudentDetails on m.StudentId equals s.StudentId
            orderby s.StudentName , m.Marks
            select new
            {
                StudentId = m.StudentId,
                Marks = m.Marks,
                StudentName = s.StudentName 
            };

当使用最新版本的Telerik Data Access时,查询会生成以下SQL(经过一些美化):

SELECT a.StudentId AS COL1, a.Marks AS COL2, b.StudentName AS COL3 
FROM StudentMerit a 
JOIN StudentDetails AS b ON (a.StudentId = b.StudentId) 
ORDER BY COL2, COL3 

如果StudentMerit和StudentDetails之间有1:M关联,另一种选择是在投影中使用引用导航属性(... StudentName = m.Student.StudentName...)并跳过显式JOIN。这应该会产生相同的SQL和结果。