LINQ左连接在SubSonic.Core中导致错误

时间:2010-01-09 17:49:29

标签: subsonic subsonic3 subsonic-active-record

我正在使用最新版本的SubSonic 3和ActiveRecord。我想在LINQ中进行左连接。它失败了,在SubSonic的某个地方出现了错误。

我有一个Vehicle对象和一个VehicleImage对象Vehicle可以有多个图像,但不是必需的。所以左连接是合适的。

这就是我所拥有的

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 个答案:

答案 0 :(得分:3)

看起来像SubSonic错误。您可能希望在SubSonic github问题页面上发布此内容:http://github.com/subsonic/SubSonic-3.0/issues

答案 1 :(得分:1)

似乎还没有针对此的修复。一个简单的修复(尽管是脏的)是创建一个处理左连接的视图,并使用默认数据从右边填充空数据,并让SubSonic在该视图上进行简单连接。

我知道这很糟糕,但现在已经解决了。由于这种限制,我无法看到丢弃SubSonic。我相信很快就会修好。

答案 2 :(得分:1)

尝试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包含所有表中的字段。