2010-08-21 47 views
1

我的代碼問題LINQ的加入(亞音速)

IQueryable<Dealer> dealers = 
    from dealer in Dealers 
    join address in AddressesUS on dealer.DealerId equals address.OwnerId 
    where dealer.Country == country && address.Owner == (int)Contact.OwnerType.Dealer 
    select new Dealer() 
    { 
     DealerId = dealer.DealerId, 
     DealerName = dealer.DealerName, 
     Country = dealer.Country, 
     Email = dealer.Email, 
     Contact = dealer.Contact, 
     Url = dealer.Url, 
     IsActive = dealer.IsActive, 
     IsWholesale = dealer.IsWholesale, 
     Address = address == null ? null : address 
    }; 

當我執行它這個片(通過調用ToArray的或其他),我得到這個錯誤:System.InvalidCastException:從「系統無效轉換。字符串'到'***。Model.Address'

現在,如果我將Dealer.Address更改爲鍵入字符串,則代碼無法按我的預期進行編譯,因爲它確實應該是AddressUS:Address類型。但是,如果我將Dealer.Address的類型更改爲對象並運行代碼,我會看到SubSonic使用來自DB的第一個字符串列填充它。 I.E. dealer.Address =「123假聖」經銷商和地址在DB中沒有關係,所以我不確定這是否會有所作爲。

我使用的.Net 3.5和MySQL 5

這裏是堆棧跟蹤

at System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider) 
    at System.String.System.IConvertible.ToType(Type type, IFormatProvider provider) 
    at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) 
    at System.Convert.ChangeType(Object value, Type conversionType) 
    at SubSonic.Extensions.Objects.ChangeTypeTo(Object value, Type conversionType) 
    at SubSonic.Extensions.Database.Load[T](IDataReader rdr, T item, List`1 ColumnNames) 
    at SubSonic.Extensions.Database.ToEnumerable[T](IDataReader rdr, List`1 ColumnNames) 
    at SubSonic.Linq.Structure.DbQueryProvider.Execute[T](QueryCommand`1 query, Object[] paramValues) 
    at lambda_method(ExecutionScope) 
    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.Buffer`1..ctor(IEnumerable`1 source) 
    at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) 
    at InSite.Controllers.DealerController.GetDealers() in ***Controllers\DealerController.cs:line 25 
    at lambda_method(ExecutionScope , ControllerBase , Object[]) 
    at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
    at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
+0

「address == null」是什麼? null:地址與「地址」不同? – Gabe 2010-08-21 02:28:49

+0

它不是,這是從我嘗試做address = address == null時遺留的代碼? null:new AddressUS {...} – Peijen 2010-08-23 16:32:05

回答

0

有亞音速一個bug ......看到這Linq and SubSonic - returning nested complex types以獲取更多信息。

您可以通過返回匿名類型而不是Dealer或通過在選擇投影之前調用ToList()來驗證它是同一問題。如果它在這些情況下起作用,那麼它就是同樣的錯誤。

+0

是的,當我使用匿名類型時它肯定有效。我很確定這是一個bug,不幸的是我有截止日期,否則我會下載源代碼,看看我能否修復它。 – Peijen 2010-08-23 16:36:23

+0

你可以把它作爲問題記錄下來,或者添加一些細節,如果它已經登錄github http://github.com/subsonic/SubSonic-3.0/issues – 2010-08-23 18:54:35