Entity Framework, как вручную создавать внутренние объединения с LinQ для прав - PullRequest
1 голос
/ 23 сентября 2011

Давайте представим, что у меня есть таблица с именем Foo с первичным ключом FooID и целочисленным неуникальным столбцом Bar.По какой-то причине в SQL-запросе мне приходится объединять таблицу Foo с самой собой несколько раз, например:

SELECT * FROM Foo f1 INNER JOIN Foo f2 ON f2.Bar = f1.Bar INNER JOIN Foo f3 ON f3.Bar = f1.Bar...

Я должен добиться этого через LINQ to Entities.

Выполнение

ObjectContext.Foos.Join(ObjectContext.Foos, a => a.Bar, b => b.Bar, (a, b) => new {a, b})

дает мне левое внешнее соединение в результирующем запросе, и мне нужны внутренние объединения, это очень важно.

КонечноЯ мог бы добиться успеха, если бы в edmx я добавил столько ассоциаций Foo с самим собой, сколько необходимо, а затем использовал их в своем коде, Entity Framework заменил бы правильное внутреннее соединение для каждой из ассоциаций.Проблема в том, что во время разработки я не знаю, сколько соединений мне понадобится.Хорошо, один из обходных путей - добавить столько из них, сколько разумно ...

Но, если ничего другого, с теоретической точки зрения, вообще возможно ли создавать внутренние объединения через EF без явного определения ассоциаций?

В LINQ to SQL был (несколько странный) способ сделать это через GroupJoin, например:

ObjectContext.Foos.GroupJoin(ObjectContext.Foos, a => a.Bar, b => b.Bar, (a, b) => new {a, b}).SelectMany(o = > o.b.DefaultIfEmpty(), (o, b) => new {o.a, b)

Я только что попробовал это вEF, уловка не работает там.Он все еще генерирует внешние соединения для меня.

Есть идеи?

1 Ответ

1 голос
/ 27 сентября 2011

В Linq to Entities ниже приведен один из способов внутреннего объединения нескольких экземпляров одной и той же таблицы:

using (ObjectContext ctx = new ObjectContext())
{

    var result = from f1 in ctx.Foo
                 join f2 in ctx.Foo on f1.bar equals f2.bar
                 join f3 in ctx.Foo on f1.bar equals f3.bar
                 select ....;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...