根据其他上下文排序
本文关键字:排序 上下文 其他 | 更新日期: 2023-09-27 17:58:29
我遇到了一些奇怪的情况(可能只有我自己才奇怪!)。
我有一些类似StudentMerit
的桌子。它具有列StudentId
、Marks
。还有另一个名为StudentDetails
的表,它具有StudentId
、StudentName
。
我需要像一样查询它
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和结果。