订单表根据另一个表中的订单

时间:2013-10-20 16:39:43

标签: c# sql linq

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

我想从表B中选择项目,并按照它们在表R中的显示顺序排序。

基本上我需要结果为IQueryable<B> - 但是如果我只是尝试从R中选择并转换为IQueryable<B>它会抛出一个异常,我不能做那个转换 - 所以一个不同的解决方案实现这一点也是可以接受的。

2 个答案:

答案 0 :(得分:0)

您可以这样做:

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

答案 1 :(得分:0)

这取决于表格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,那么劳伦斯的方法就是您必须采用的方法。