Subsonic Linq连接问题(亚音速)

Subsonic Linq连接问题(亚音速),subsonic,subsonic3,Subsonic,Subsonic3,我有这段代码 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 ne

我有这段代码

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
    };
IQueryable经销商=
从经销商到经销商
在dealer.DealerId上的AddressUs中加入地址等于address.OwnerId
其中dealer.Country==国家和地址。Owner==(int)Contact.OwnerType.dealer
选择新经销商()
{
DealerId=dealer.DealerId,
DealerName=dealer.DealerName,
国家=经销商。国家,
Email=经销商。Email,
联系人=经销商。联系人,
Url=dealer.Url,
IsActive=经销商。IsActive,
IsWholesale=经销商。IsWholesale,
地址=地址==空?空:地址
};
当我执行它时(通过调用ToArray或其他方法),我得到以下错误:System.InvalidCastException:从'System.String'到'***.Model.Address'的转换无效

现在,如果我将Dealer.Address更改为string类型,代码将无法按照我的预期编译,因为它应该是AddressUS:Address类型。但是,如果我将Dealer.Address的类型更改为object并运行代码,我会看到亚音速使用DB中的第一列字符串填充它。即经销商地址=“123 Fake St.”经销商和地址在DB中没有关系,因此我不确定这是否会产生影响

我正在使用.NET3.5和MySQL5

这是堆栈跟踪

   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)
at System.Convert.DefaultToType(IConvertible值,类型targetType,IFormatProvider)
位于System.String.System.IConvertible.ToType(类型类型,IFormatProvider提供程序)
位于System.Convert.ChangeType(对象值、类型conversionType、IFormatProvider)
在System.Convert.ChangeType(对象值,类型conversionType)
在亚音速下.Extensions.Objects.ChangeTypeTo(对象值,类型转换类型)
在亚音速.Extensions.Database.Load[T](IDataReader rdr,T项,列出'1列名称)
在亚音速.Extensions.Database.ToEnumerable[T](IDataReader rdr,列出'1列名称)
在亚音速.Linq.Structure.DbQueryProvider.Execute[T](QueryCommand`1查询,对象[]参数值)
lambda_方法(ExecutionScope)
在亚音速.Linq.Structure.DbQueryProvider.Execute(表达式)
在SubSonic.Linq.Structure.QueryProvider.System.Linq.IQueryProvider.Execute(表达式)中
在亚音速.Linq.Structure.Query`1.GetEnumerator()中
在System.Linq.Buffer`1..ctor处(IEnumerable`1源)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1源)
在***Controllers\DealerController.cs中的InSite.Controllers.DealerController.getDealders()中:第25行
在lambda_方法上(ExecutionScope、ControllerBase、Object[])
位于System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller,Object[]参数)
位于System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext ControllerContext,IDictionary`2参数)
位于System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor,IDictionary`2参数)
在System.Web.Mvc.ControllerActionInvoker.c_uudisplayClassD.b_uua()中
位于System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter筛选器、ActionExecutingContext预文本、Func`1 continuation)

亚音速有一个错误。。。有关更多信息,请参见此


您可以通过返回匿名类型(而不是经销商)或在选择投影之前调用ToList()来验证是否存在相同的问题。如果它在这些情况下工作,那么它就是同一个bug。

如何将
address==null?null:address
不同于仅仅
address
?它不是,这是我尝试执行address=address==null时留下的代码?空:新地址{…}是的,当我使用匿名类型时,它肯定有效。我很确定这是一个bug,不幸的是我有最后期限,否则我会下载源代码,看看是否可以修复它。你能把它作为一个问题记录下来吗?如果它已经登录到github上,你能添加一些细节吗