2010-08-21 3 views
1

J'ai cette tranche codeProblème avec Linq JOIN (subsonique)

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 
    }; 

Quand je l'exécute (en appelant ToArray ou autre), je reçois cette erreur: System.InvalidCastException: non valide cast de « système. Chaîne 'to' *** Model.Address '

Maintenant, si je change la chaîne Dealer.Address à taper, le code ne compile pas comme je m'y attendais car il devrait être vraiment de type AddressUS: Address. Toutefois, si je change le type de Dealer.Address à l'objet et exécutez le code, je vois que SubSonic l'a peuplé avec la première colonne de chaîne de DB. C'EST À DIRE. dealer.Address = "123 Faux St." Il n'y a pas de relation dans la base de données pour le concessionnaire et l'adresse, donc je ne suis pas sûr si cela ferait une différence.

J'utilise .Net 3.5 et MySql 5.

Voici la trace de la pile

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

Comment est-ce que 'address == null? null: address' différent de juste 'address'? – Gabe

+0

ce n'est pas, c'est un reste de code quand j'essaye de faire address = adresse == null? null: new AddressUS {...} – Peijen

Répondre

0

Il y a un bug dans subsonique ... voir ce Linq and SubSonic - returning nested complex types pour plus d'informations.

Vous pouvez vérifier que c'est le même problème en retournant un type anonyme, au lieu d'un revendeur, ou en appelant ToList() avant la projection Sélectionner. Si cela fonctionne dans ces cas, c'est le même bug.

+0

Oui, ça fonctionne vraiment quand j'utilise un type anonyme. J'étais assez sûr que c'était un bug, malheureusement j'ai des délais sinon j'aurais téléchargé le code source et voir si je peux le réparer. – Peijen

+0

Pouvez-vous enregistrer ce problème ou ajouter des détails s'il est déjà connecté sur github http://github.com/subsonic/SubSonic-3.0/issues –