2011-05-23 52 views
2

我已经建立了基于第三个表的多对多关系,第三个表只保存一对关键值。现在我想要做一个查询,将左侧的右侧表格键值分组而不需要其他数据。从EF协会只提取关键值

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

假设你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等。除了匿名类型,您还可以创建自己的自定义类型,然后在上述查询中投影到此类型中。