LINQ Left Join вызывает ошибку в SubSonic.Core - PullRequest
0 голосов
/ 09 января 2010

Я использую последнюю версию SubSonic 3 и ActiveRecord. Я пытаюсь сделать левое соединение в LINQ. Сбой с ошибкой где-то в SubSonic.

У меня есть объект Vehicle и объект VehicleImage. Автомобиль может иметь несколько изображений, но это не обязательно. поэтому уместно левое соединение.

Это то, что у меня есть

var vehicle = from v in Vehicle.All()
              join dl in DealerLocation.All() on v.DealerLocationID equals dl.ID
              join vi in VehicleImage.All() on v.ID equals vi.VehicleID into VehicleImages
              from vij in VehicleImages.DefaultIfEmpty()
              && vij.IsPrimary
              select new
              {
                  v, vij.Image
              };

Это ошибка, которую я получаю

The expression of type 'System.Linq.IQueryable`1[<>f__AnonymousType1`2[<>f__AnonymousType0`2[Project.Data.Vehicle,Project.Data.DealerLocation],System.Collections.Generic.IEnumerable`1[Project.Data.VehicleImage]]]' is not a sequence

Это трассировка стека

   at SubSonic.Linq.Translation.QueryBinder.ConvertToSequence(Expression expr)
   at SubSonic.Linq.Translation.QueryBinder.VisitSequence(Expression source)
   at SubSonic.Linq.Translation.QueryBinder.BindSelectMany(Type resultType, Expression source, LambdaExpression collectionSelector, LambdaExpression resultSelector)
   at SubSonic.Linq.Translation.QueryBinder.VisitMethodCall(MethodCallExpression m)
   at SubSonic.Linq.Structure.ExpressionVisitor.Visit(Expression exp)
   at SubSonic.Linq.Structure.DbExpressionVisitor.Visit(Expression exp)
   at SubSonic.Linq.Translation.QueryBinder.Visit(Expression exp)
   at SubSonic.Linq.Translation.QueryBinder.Bind(QueryMapping mapping, Expression expression)
   at SubSonic.Linq.Structure.QueryMapping.Translate(Expression expression)
   at SubSonic.Linq.Structure.DbQueryProvider.Translate(Expression expression)
   at SubSonic.Linq.Structure.DbQueryProvider.GetExecutionPlan(Expression expression)
   at SubSonic.Linq.Structure.DbQueryProvider.Execute(Expression expression)
   at SubSonic.Linq.Structure.QueryProvider.System.Linq.IQueryProvider.Execute(Expression expression)
   at SubSonic.Linq.Structure.Query`1.GetEnumerator()
   at System.Linq.SystemCore_EnumerableDebugView`1.get_Items()

Заранее благодарим за понимание.

Ответы [ 3 ]

3 голосов
/ 12 января 2010

Похоже на ошибку SubSonic.Возможно, вы захотите опубликовать это на странице проблем SubSonic на github: http://github.com/subsonic/SubSonic-3.0/issues

1 голос
/ 07 февраля 2010

Попытка Fluent Query может быть решением на данный момент, может быть. Что-то вроде:

var DB = new myDB();
IList<LiteObject> myLiteObject = DB.Select
    .From<Table1>()
    .InnerJoin<Table2>()
    .LeftOuterJoin<Table3>()
    .Where(Table1.IdColumn).IsEqualTo(1)
    .And(Table2.IdColumn).IsEqualTo(2)
    .ExecuteTypedList<LiteObject>();

где LiteObject включает поля из всех таблиц.

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

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

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

...