2012-02-28 58 views
1

我在表A和B之间有多对多的关系。如何在EF Code First中查询连接表?

由于我先使用代码,数据库表'AB'被自动创建。我没有它的实体模型。

例如,我可以如何查询属于A.id=x的所有B?

编辑:

我加载A或B之后,我可以轻松搞定分别列出了B和A的引用。

我真正的问题是要做出不包括已经与A.相关联的所有B的单个查询

这是我想做的事:

query.Where(**b.ID NOT IN (SELECT B.ID FROM AB WHERE A=5)**) 

我相信我能做到这一点与一个原始的SQL查询,但我想要保持一致并在我可以使用IQueryable/LINQ。

+1

您可以发布您的实体? – cadrell0 2012-02-28 20:52:47

回答

2

你可以试试这个:

var bsNotAssociatedWithA5 = context.Bs 
    .Where(b => !b.As.Any(a => a.Id == 5)) 
    .ToList(); 

它创建下列SQL:

SELECT 
[Extent1].[BId] AS [BId], 
[Extent1].[BColumn1] AS [BColumn1], 
// more columns 
FROM [dbo].[Bs] AS [Extent1] 
WHERE NOT EXISTS 
    (SELECT 1 AS [C1] 
    FROM [dbo].[ABs] AS [Extent2] 
    WHERE ([Extent1].[BId] = [Extent2].[BId]) AND (5 = [Extent2].[AId])) 

编辑

当使用DbContext(EF> = 4.1),您可以通过使用IQueryableToString()检查SQL:

var bsNotAssociatedWithA5Query = context.Bs 
    .Where(b => !b.As.Any(a => a.Id == 5)); 

string sql = bsNotAssociatedWithA5Query.ToString(); 

var bsNotAssociatedWithA5 = bsNotAssociatedWithA5Query.ToList(); 
+0

你......你是英雄。这工作完美。 (顺便说一句,你是如何提取生成的SQL?) – getit 2012-02-29 01:24:50

+0

@getit:这很容易,看到我上面的编辑。 – Slauma 2012-02-29 09:52:43

+0

完美,再次感谢 – getit 2012-02-29 17:25:37

1

A.Bs

如果你有一个实例,你应该有在A类中的属性从A. retrive所有的烧烤

+0

谢谢,但我想我应该更具体。 – getit 2012-02-28 21:48:59