LINQ:做一个订单!

时间:2009-09-24 05:19:04

标签: c# .net linq wcf

我有一些Linq to Entity代码,如下所示:

var tablearows = Context.TableB.Include("TableA").Where(c => c.TableBID == 1).Select(c => c.TableA).ToList();

所以我将TableA.TableBID = 1

返回TableA的结果

这一切都很好

现在我如何按其列之一对TableA进行排序?两个表之间存在多对多关系

我尝试了多种方式,例如

var tablearows = Context.TableB.Include("TableA").Where(c => c.TableBID == 1).Select(c => c.TableA).OrderBy(p => p.ColumnToSort).ToList();

在上述情况下,当我输入“p。”我无法访问TableA中的列,大概是因为它是TableA对象的集合,而不是单行

2 个答案:

答案 0 :(得分:3)

如何使用SelectMany而不是Select:

var tablearows = Context.TableB.Include("TableB")
     .Where(c => c.TableBID == 1)
     .SelectMany(c => c.TableA)
     .OrderBy(p => p.ColumnToSort)
     .ToList();

编辑: 下面的表达式返回TableAs的集合 - 集合的每个元素都是TableA集合的一个实例而不是TableA实例 - 这就是为什么你无法获得TableA的属性的原因:

var tablearows = Context.TableB.Include("TableB")
     .Where(c => c.TableBID == 1)
     .Select(c => c.TableA);

如果我们将Select转为SelectMany,我们将结果作为一个包含元素的连接集合得到:

var tablearows = Context.TableB.Include("TableB")
     .Where(c => c.TableBID == 1)
     .SelectMany(c => c.TableA);

答案 1 :(得分:2)

好的,所以现在我已经接受了很多关系,我认为Canavar是对的 - 你想要一个SelectMany

同样,在查询表达式中更容易看到:

var tableARows = from rowB in Context.TableB.Include("TableA")
                 where rowB.TableBID == 1
                 from rowA in rowB.TableA
                 orderby rowA.ColumnToSort
                 select rowA;

它不起作用的原因是你有不同的结果类型。以前,您得到的类型如下:

List<EntitySet<TableA>>

(我不知道确切的类型,因为我不是LINQ to Entities的人,但它会是那样的。)

现在我们已将所有TableA行压平为一个列表:

List<TableA>

现在,您无法按行中的单个列排序序列 - 但您可以按列排序序列。所以基本上你对问题的直觉是对的,当你说“大概是因为它是TableA对象的集合,而不是单行”时 - 但是你的意思并不十分清楚“它”。

现在,这种扁平化是否真的适合你?这意味着你不再知道哪个B贡献了任何特定的A.这里只涉及一个B,所以没关系?如果是这样,还有另一个选项可能甚至表现更好(我真的不知道,但您可能希望查看每种情况下生成的SQL并对其进行分析):

var tableARows = Context.TableB.Include("TableA")
                        .Where(b => b.TableBID == 1)
                        .Single()
                        .TableA.OrderBy(a => a.ColumnToSort)
                        .ToList();

请注意,如果不是表B中带有ID的行,那么这将失败(或至少在LINQ to Objects中;我不确切知道实体中会发生什么) 1.基本上它选择单行,然后选择与该行关联的所有As,并对它们进行排序。