У нас есть следующая тестовая модель в файле dbml:
Модель http://www.freeimagehosting.net/uploads/a86582498a.gif
Для тестового примера в таблице 4 записи: 1 родитель, 3 ребенка. Мы ищем братьев и сестер конкретной записи, в том числе конкретной записи.
using (var db = new TestDataContext())
{
var query =
from f in db.Foos
where f.Name == "Two"
select f.Foo1.Foos; // get the record's parent's children
var foos = query.SelectMany(f => f); // project the EntitySet
Assert.AreEqual(3, foos.Count()); // passes
}
Возвращает правильные элементы со следующим SQL:
SELECT [t2].[FooId],
[t2].[ParentFooId],
[t2].[Name]
FROM [dbo].[Foos] AS [t0]
INNER JOIN [dbo].[Foos] AS [t1] ON [t1].[FooId] = [t0].[ParentFooId]
CROSS JOIN [dbo].[Foos] AS [t2]
WHERE ([t0].[Name] = @p0)
AND ([t2].[ParentFooId] = [t1].[FooId])
Нас интересует CROSS JOIN, это, очевидно, результат SelectMany?
Есть ли другой способ, которым мы должны подходить к этому, чтобы не иметь CROSS JOIN?