我有一些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对象的集合,而不是单行
答案 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,并对它们进行排序。