2010-01-09 88 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