0

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

我有一些像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不加入表格的情况下直接排序?

请帮帮我。

4

1 回答 1

1

您可以使用 join 来简化查询,如下所示:

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

于 2014-04-16T11:26:41.480 回答