为什么将'System.Collections.Generic.IEnumerable'转换为System.Collections.Generic.IEnumerable被视为错误

时间:2013-07-09 11:08:51

标签: entity-framework

我的MVC应用程序中有以下视图模型类: -

public class CustomerDetails
    {   public AccountDefinition AccountDefinition {get; set;}
        public SDOrganization SDOrganization {get; set;}
        public IEnumerable<SiteDefinition> SiteDefinition { get; set; }
        public IEnumerable<AaaPostalAddress> AaaPostalAddress { get; set; }
        public IEnumerable<AaaContactInfo> AaaContactInfo { get; set; }
        public IEnumerable<SDUser> SDUser { get; set; }   }

如果我尝试编写此查询,请使用: -

 var customerDetails = entities.AccountDefinitions
       .Where(a => a.ORG_ID == id)
       .Select(cd => new CustomerDetails
       {
           AccountDefinition = cd,
           SDOrganization = cd.SDOrganization,
           AaaPostalAddress = cd.SDOrganization.AaaPostalAddresses,
           AaaContactInfo = cd.SDOrganization.AaaContactInfoes,
           SiteDefinition = cd.SiteDefinitions,
         SDUser = cd.SiteDefinitions.Select(p => p.UserSiteMappings.Select(p2 => p2.SDUser))//this is raising the error
       })
       .SingleOrDefault();
       return customerDetails;
        }

我会收到以下错误: -

  

无法将System.Collections.Generic.IEnumerable<System.Collections.Generic.IEnumerable<TMS.Models.SDUser>>类型隐式转换为System.Collections.Generic.IEnumerable<TMS.Models.SDUser>。存在显式转换(您是否错过了演员?)

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:2)

由于在Java中实现泛型的方式,您可以使用类似List<E>的泛型类型而不提供泛型参数(例如,仅List)。 C#不会以这种方式工作,因此您在此问题的标题中提供的类型(System.Collections.Generic.IEnumerable)实际上并不存在。这里的实际问题是:

  

为什么将System.Collections.Generic.IEnumerable<System.Collections.Generic.IEnumerable<TMS.Models.SDUser>>转换为System.Collections.Generic.IEnumerable<TMS.Models.SDUser>会被视为错误。

答案类似于您无法将类型int[,]的对象分配给int[]类型的变量的原因。也许您打算在报告错误的行上使用SelectMany而不是Select。这会“压扁”单个结果,以生成包含每个子结果中所有元素的单个枚举。

SDUser = cd.SiteDefinitions.SelectMany(
    p => p.UserSiteMappings.Select(p2 => p2.SDUser))