仅从EF关联中获取键值

时间:2011-05-23 12:27:17

标签: entity-framework many-to-many entity-sql

我在两个表之间建立了一个多对多关联,基于第三个表只包含一对键值。现在,我想进行一个查询,通过左侧对正确的表键值进行分组,而不需要其他数据。

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中提取。

当然必须有一种更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

假设您的班级Left有导航属性RightsRight个实体的集合),您可以尝试这样做:

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等其他字段。您也可以创建自己的自定义类型,然后在上面的查询中投影到此类型,而不是匿名类型。