无法将类型为'<> f__AnonymousType1`2 [System.Int64,System.String]'的对象强制转换为'ConsoleApplication1.Profile'。

时间:2011-10-14 09:14:41

标签: c# linq-to-entities

我对Linq和Entity框架工作很新,我的下面的代码有问题。我收到错误

  

无法转换类型为'<> f__AnonymousType1`2的对象   [System.Int64,System.String]'键入'ConsoleApplication1.Profile'

我的代码是:

static void Main(string[] args)
        {
            ProfileEntitiesContext obj = new ProfileEntitiesContext();
            List<Profile> list = new List<Profile>();
            var test = (from c in obj.Customer
                       join a in obj.Address
                       on c.ProfileId
                       equals a.Customer.ProfileId 
                       select new
                       {
                           CustomerProfileId = c.CustomerProfileId,
                           FirstName = c.FirstName
                   AddressLine1 = a.Line1   
                       }).ToList().Cast<CustomerConfidentialProfile>();

foreach(var cust in test) // Unable to cast object of type  '<>f__AnonymousType1`2
//[System.Int64,System.String]' to type 'ConsoleApplication1.Profile'.
            {
                list.Add(cust);
            }
        }

public class Profile
    {
        int _CustomerProfileId;
        string _FirstName;
        string _AddressLine1;


        public int CustomerProfileId
        {
            get { return _CustomerProfileId; }
            set { _CustomerProfileId = value; }
        }


        public string FirstName
        {
            get { return _FirstName; }
            set { _FirstName = value; }
        }

  public string AddressLine1
        {
            get { return _AddressLine1; }
            set { _AddressLine1= value; }
        }
}

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:8)

您的问题是,从LINQ查询中返回一个匿名类型(使用new { ... }语法。

但是,您尝试将此对象卡入List<Profile>。所以它抱怨你试图将这个匿名对象放入一个只有Profile个对象的List中。

为什么不将new { ...替换为new Profile { ...,因为您在匿名类型中使用的字段与在配置文件类型中使用的字段相同。

同时删除ToListCast

答案 1 :(得分:3)

那是因为匿名类型<>f__AnonymousType1'2 [System.Int64,System.String]不是个人档案! (不是实例而不是祖先的实例)。尝试替换您的选择:

select new CustomerConfidentialProfile
{
CustomerProfileId = c.CustomerProfileId,
FirstName = c.FirstName,
AddressLine1 = a.Line1,
property assignments go futher   
})

答案 2 :(得分:1)

您无法将匿名类型转换为命名类型。但是你可以直接构造一个命名类型:

select new CustomerConfidentialProfile()
                   {
                       CustomerProfileId = c.CustomerProfileId,
                       FirstName = c.FirstName
               AddressLine1 = a.Line1   
                   }).ToList();