2010-01-09 85 views
0

我使用的是最新版本的SubSonic 3和ActiveRecord。我正在尝试在LINQ中进行左连接。它在SubSonic中的某处发生错误时失败。LINQ Left Join在SubSonic.Core中导致错误

我有一个车辆对象和一个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() 

感谢。

回答

1

似乎仍然没有解决这个问题。一个简单的修复(尽管很脏)是创建一个处理左连接的视图,并使用默认数据填充右边的空数据,并让SubSonic在该视图上进行简单连接。

我知道这是可怕的,但它现在是一个修复。由于这个限制,我看不到SubSonic的下降。我相信它会尽快解决。

1

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

+0

看起来像Fluent查询可以做我现在需要的东西,但我有另一个问题。我没有一个好方法可以将多个表中的数据导入流畅查询列表的结果中。我有许多表连接到列名与其他表相同的地方。有了LINQ,我正在混淆这些列。流利的查询似乎没有支持。所以执行类型列表将不起作用,因为列名不能匹配我的类中的名称。我在Fluent查询中丢失了什么? – 2010-02-08 17:54:02

+0

其实,从头开始。 Fluent Query没有对FindColumn中的列名进行限定,因此最终会在查询中返回大量相同的列。这有各种问题。猜猜我要创建一个视图。 – 2010-02-08 18:00:03

+0

我没有尝试还没有但该文档说(简单的选择与类型列): INT记录=新NorthwindDB.Select( 新的String [] { ProductTable.ProductIDColumn, Product.ProductNameColumn}) 。从 ().GetRecordCount(); – Aytek 2010-02-09 17:05:26