Subsonic 3.0 Left Join - PullRequest
       14

Subsonic 3.0 Left Join

2 голосов
/ 16 июля 2009

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

Я почти уверен, что запрос правильный, так как я делал это несколько раз с объектами и Linq2Sql.

            var post = from p in Post.All()
                        join q in Quote.All() on p.ID equals q.PostID into pq
                        where p.ID == id.Value
                        from qt in pq.DefaultIfEmpty()
                        select new {p, qt};

Просто кажется, что subsonic не может генерировать необходимый SQL из запросов linq левого соединения.

Я что-то здесь не так делаю? Есть ли работа вокруг?

Обновление: я использую subsonic 3.0.0.2, вот ошибка, которую я получаю при попытке левого соединения с subsonic

Выражение типа 'System.Collections.Generic.IEnumerable 1[GetAQuote.Post]' cannot be used for parameter of type 'System.Linq.IQueryable 1 [GetAQuote.Post]' метода 'System.Linq.IQueryable 1[<>f__AnonymousType2 2 [GetAQuote.Post, System.Collections.Generic.IEnumerable 1[GetAQuote.Quote]]] GroupJoin[Post,Quote,Int32,<>f__AnonymousType2 2] (System.Linq.IQueryable 1[GetAQuote.Post], System.Collections.Generic.IEnumerable 1 [GetAQuote.Quote], System.Linq.Expressions.Expression 1[System.Func 2 [GetAQuote.Post, System.Int32]], System.Linq.Expressions.Expression 1[System.Func 2 [GetAQuote.Quote, System.Int32]], System.Linq.Expressions.Expression 1[System.Func 3 [GetAQuote.Post, System.Collections.Generic.IEnumerable 1[GetAQuote.Quote],<>f__AnonymousType2 2 [GetAQuote.Post, System.Collections.Generic .IEnumerable`1 [GetAQuote.Quote]]]]) '

Ответы [ 4 ]

4 голосов
/ 19 июля 2009

У меня есть вилка для левого соединения, которую я вытащу в ближайшие несколько дней - дай мне неделю, и я отправлю еще один релиз с этим.

3 голосов
/ 05 мая 2011

Возрождаем старую тему здесь, но для тех, кто ищет потом, есть другой синтаксис, который, кажется, правильно работает в SubSonic3 для левого внешнего соединения.

Вместо выражения Linq из исходного поста:

        var post = from p in Post.All()
                    join q in Quote.All() on p.ID equals q.PostID into pq
                    where p.ID == id.Value
                    from qt in pq.DefaultIfEmpty()
                    select new {p, qt};

Перепишите его на:

        var post = from p in Post.All()
                    from q in Quote.All().Where(x => x.PostID == p.ID).DefaultIfEmpty()
                    where p.ID == id.Value
                    select new {p, q};

Надеюсь, это кому-нибудь поможет!

1 голос
/ 16 июля 2009

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

0 голосов
/ 25 января 2010

t, кажется, до сих пор нет исправления для этого. Простое исправление (хотя и «грязное») - создать представление, которое обрабатывает левое соединение и заполняет пустые данные справа данными по умолчанию, а SubSonic выполняет простое объединение для этого представления.

Я знаю, что это ужасно, но сейчас это исправление. Я не мог видеть падение SubSonic из-за этого ограничения. Я уверен, что это будет исправлено в ближайшее время.

...