从另一个上下文排序

时间:2014-04-16 07:32:03

标签: c# sql linq telerik-open-access

我对一些奇怪的情况感到震惊(可能只对我来说很奇怪!)。

我有一些像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);       

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

有没有办法在没有加入表的情况下直接基于StudentName进行排序?

请帮帮我。

1 个答案:

答案 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和结果。