我有 tableB
和 table R
,它们的字段定义相同。表 R 包含 B 中的一些项目,按特定顺序排序(与任何值都不相关))。
我想从表 B 中选择项目,并按照它们在表 R 中出现的顺序对它们进行排序。
基本上我需要结果IQueryable<B>
- 但如果我只是尝试从 R 中选择并进行转换,因为IQueryable<B>
它会引发我无法进行转换的异常 - 所以实现这一目标的不同解决方案也是可以接受的。
这取决于您所说的order of tableR
是什么意思。
你说这两个表有相同的对象。因此,如果您只想考虑 table 中的项目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
as的行B
,那么您必须采用 Laurence 的方法。
你可以这样做:
Func<R, B> r2b = r => new B { Id = r.Id, Description = r.Description};
var bs = Rs.Select(r => r2b(r));