我对一些奇怪的情况感到震惊(可能只对我来说很奇怪!)。
我有一些像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);
因为它以匿名类型返回输出。我在select查询中不需要StudentName
,但需要对查询进行排序。
有没有办法在没有加入表的情况下直接基于StudentName
进行排序?
请帮帮我。
答案 0 :(得分:1)
您可以使用以下连接简化查询:
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和结果。