根据另一个表中的顺序对表进行排序

本文关键字:排序 顺序 另一个 | 更新日期: 2023-09-27 18:36:04

我有表B和表R,它们的字段定义相同。表 R 包含 B 中的一些项目,按特定顺序排序(与任何值无关))。

我想从表 B 中选择项目,并按照它们在表 R 中出现的顺序对它们进行排序。

基本上我需要结果作为IQueryable<B> - 但如果我只是尝试从 R 中选择并转换为 IQueryable<B>它会抛出一个异常,我无法进行该转换 - 因此实现此目的的不同解决方案也是可以接受的。

根据另一个表中的顺序对表进行排序

你可以做这样的事情:

Func<R, B> r2b = r => new B { Id = r.Id, Description = r.Description};
var bs = Rs.Select(r => r2b(r));
这取决于

你所说的R顺序是什么意思。

你说两个表有相同的对象。因此,如果您只想考虑表中的项目 R ,在这种情况下,需要加入它们。如果未找到匹配项,则会得到一个空序列。像这样:

 var ordered = from    b in bs
               join    r in rs
               on      b equals r //since you said they are identical
               orderby r //or whatever R table is ordered with
               select  b;

如果只想获取表 R 的排序顺序(并且两个表中的行数相等),则可以使用 Zip。

var ordered  = bs.Zip(rs, (b, r) => new { b, r })
                 .OrderBy(x => x.r) //or whatever R table is ordered with
                 .Select(x = x.b);

编辑:

您必须指定在Join的情况下定义平等的基础。还有R表的排序依据。您可以像这样指定它:

 var ordered = from    b in bs
               join    r in rs
               on      b.Id equals r.Id //or whatever the equality is based on.
               orderby r.Id //or whatever R table is ordered with
               select  b;

如果您不想检查整个字段是否相等,那么您可以执行以下操作:

 var ordered = from    b in bs
               join    r in rs
               on      new { b.Id, b.Name } equals new { r.Id, r.Name }
               orderby r.Id 
               select  b;

Zip方法也是如此:

var ordered  = bs.Zip(rs, (b, r) => new { b, r })
                 .OrderBy(x => x.r.Id) //<- specify here
                 .Select(x = x.b);

如果你只想把R的行作为B,那么劳伦斯的方法就是你必须追求的。