我在两个表之间建立了一个多对多关联,基于第三个表只包含一对键值。现在,我想进行一个查询,通过左侧对正确的表键值进行分组,而不需要其他数据。
LeftTable { LeftID, LeftField1, LeftField2 }
JoinTable { LeftID, RightID}
RightTable { RightID, RightField1, RightField2 }
有没有办法基本上只查询JoinTable并获取所有'RightIDs'按'LeftIDs'分组而不让SQL试图从任何一方获取字段? JoinTable本身不是模型中的实体,而是映射到关联。
我使用ObjectQuery和EntityCommand(ESQL)进行了一些实验,并且似乎仍然通过加入我不需要的RightTable来加载其他字段。
我的ESQL看起来像:
SELECT lt.LeftID, (SELECT rt.RightID
FROM NAVIGATE(lt, MyModel.LeftToRightAssoc, RightTable) as rt)
FROM MyEntities.LeftTable as lt;
但生成的SQL仍然在RightField1和RightField2中提取。
当然必须有一种更简单的方法吗?
答案 0 :(得分:1)
假设您的班级Left
有导航属性Rights
(Right
个实体的集合),您可以尝试这样做:
var list = context.Lefts.Select(l => new
{
LeftId = l.LeftId,
RightIds = l.Rights.Select(r => r.RightId)
});
foreach (var item in list)
{
Console.WriteLine("LeftId = {0}", item.LeftId);
foreach (var rightId in item.RightIds)
{
Console.WriteLine("RightId = {0}", rightId);
}
}
您将获得一组匿名类型对象,其中每个元素都包含LeftId
和相应RightIds
的集合。此查询不应触及RightField1
等其他字段。您也可以创建自己的自定义类型,然后在上面的查询中投影到此类型,而不是匿名类型。