【问题标题】:Issue with Linq Join (subsonic)Linq Join 问题(亚音速)
【发布时间】:2010-08-21 11:08:16
【问题描述】:

我有这段代码

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: Invalid cast from 'System.String' to '***.Model.Address'

现在,如果我将 Dealer.Address 更改为字符串类型,代码将无法按预期编译,因为它实际上应该是 AddressUS:Address 类型。但是,如果我将 Dealer.Address 的类型更改为对象并运行代码,我会看到 SubSonic 使用 DB 中的第一个字符串列填充它。 IE。 Dealer.Address = "123 Fake St."经销商和地址在数据库中没有关系,所以我不确定这是否会有所不同。

我正在使用 .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)

【问题讨论】:

  • address == null ? null : addressaddress 有何不同?
  • 不是,那是我尝试做 address = address == null 时留下的代码? null : 新地址美国 {...}

标签: subsonic subsonic3


【解决方案1】:

Subsonic 中存在一个错误……请参阅Linq and SubSonic - returning nested complex types 了解更多信息。

您可以通过返回匿名类型而不是 Dealer 或在 Select 投影之前调用 ToList() 来验证是否存在相同的问题。如果它在这些情况下有效,那么它就是同一个错误。

【讨论】:

  • 是的,当我使用匿名类型时它确实有效。我很确定这是一个错误,不幸的是我有截止日期,否则我会下载源代码并看看我是否可以修复它。
  • 如果它已经登录 github github.com/subsonic/SubSonic-3.0/issues,你能把它记录为问题或添加一些细节吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多