无法将类型'.List <anonymoustype#1>'隐式转换为'.List <webapplication2.customer>'</webapplication2.customer> </anonymoustype#1>

时间:2013-07-24 14:23:25

标签: c# asp.net linq entity-framework

在以下代码中返回一个列表:

public List<Customer> GeAllCust()
{
    var results = db.Customers
        .Select(x => new { x.CustName, x.CustEmail, x.CustAddress, x.CustContactNo })
        .ToList()
    return results;
}

我收到错误报告,说明C#无法转换列表:

  

错误:无法将System.Collections.Generic.List<AnonymousType#1>类型隐式转换为System.Collections.Generic.List<WebApplication2.Customer>

为什么?

以下是一个屏幕截图,显示了Visual Studio在错误的工具提示中提供的一些其他信息:

返回一些列而不是整个表是否正确??

public object GeAllCust()
{
       var results = db.Customers.Select(x => new { x.CustName, x.CustEmail, x.CustAddress, x.CustContactNo }).ToList();
        return results;
}

5 个答案:

答案 0 :(得分:20)

当您查看代码时:

x => new { ... }

这会创建一个新的anonymous type。如果您不需要仅撤回特定的一组列,则可以执行以下操作:

return db.Customers.ToList();

这假设CustomersIEnumerable<Customer>,应与您要返回的内容相匹配。

修改

您已注意到您只想返回某个列的子集。如果在编码时需要任何类型的编译器帮助,则需要创建一个自定义类来保存值:

public class CustomerMinInfo
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Address { get; set; }
    public int? ContactNumber { get; set; }
}

然后将您的功能更改为以下内容:

public List<CustomerMinInfo> GetAllCust()
{
    var results = db.Customers.Select(x => new CustomerMinInfo()
    {
        Name = x.CustName,
        Email = x.Email,
        Address = x.Address,
        ContactNumber = x.CustContactNo
    })
    .ToList();

    return results;
}

这将有效,然而,您将失去与数据库上下文的所有关系。这意味着如果您更新返回的值,它将不会将其重新粘贴到数据库中。

另外,只是重复我的注释,返回更多列(字节数组除外)并不一定意味着更长的执行时间。返回大量行意味着更多的执行时间。您的功能是返回数据库中的每个客户,当您的系统增长时,即使数量减少,也会开始挂起您的程序。

答案 1 :(得分:6)

您选择的是匿名类型,而不是Customer

如果你想这样做(有点),你可以这样写:

return db.Customers.Select(x => new Customer { Name = x.CustName, Email = x.CustEmail, Address = x.CustAddress, ContactNo = x.ContactNo }).ToList();

这假定Customer对象上的属性是我称之为的对象。

**编辑**根据您的评论,

如果要返回表的子集,可以执行以下两项操作之一:

  1. 按照我上面指定的方式返回Customer的翻译后的表格,或者:
  2. 为您的业务层创建一个仅包含这四个字段的新类,并更改您的方法以返回List<ShrunkenCustomer>(假设ShunkenCustomer是您为新类选择的名称。)

答案 2 :(得分:4)

GetAllCust()应该返回Customer的列表,Select新建将创建一个匿名类型列表,您需要从查询中返回一个Customer列表。 尝试:

var results = db.Customers.Select( new Customer{CustName = x.CustName}).ToList(); //include other fields

答案 3 :(得分:1)

我猜Customer是你自己定义的课程? 我的建议是做类似以下的事情:

var results = db.Customers.Select(x => new Customer(x.Custname, x.CustEmail, x.CustAddress, x.CustContactNo)).ToList();

原因是您尝试返回Customer列表,但链接的结果是包含这四个值的匿名类。 这当然要求你有一个构造函数来获取这四个值。

答案 4 :(得分:0)

基本上无论你在var类型中得到什么,都要循环并将其存储在列表中&lt;&gt;对象然后循环并实现你的目标。这是我发布主要细节的代码。 列出obj = new List();

        var orderlist = (from a in db.Order_Master
                         join b in db.UserAccounts on a.User_Id equals b.Id into abc
                         from b in abc.DefaultIfEmpty()
                         select new
                         {
                             Order_Id = a.Order_Id,
                             User_Name = b.FirstName,
                             Order_Date = a.Order_Date,
                             Tot_Qty = a.Tot_Qty,
                             Tot_Price = a.Tot_Price,     
                             Order_Status = a.Order_Status,
                             Payment_Mode = a.Payment_Mode,
                             Address_Id = a.Address_Id 

                         });


        List<MasterOrder> ob = new List<MasterOrder>();

        foreach (var item in orderlist)
        {

            MasterOrder clr = new MasterOrder();
            clr.Order_Id = item.Order_Id;
            clr.User_Name = item.User_Name;
            clr.Order_Date = item.Order_Date;
            clr.Tot_Qty = item.Tot_Qty;
            clr.Tot_Price = item.Tot_Price;
            clr.Order_Status = item.Order_Status;       
            clr.Payment_Mode = item.Payment_Mode;
            clr.Address_Id = item.Address_Id;              
            ob.Add(clr);


        }



        using(ecom_storeEntities en=new ecom_storeEntities())
        {
            var Masterlist = en.Order_Master.OrderByDescending(a => a.Order_Id).ToList();


            foreach (var i in ob)
            {
                var Child = en.Order_Child.Where(a => a.Order_Id==i.Order_Id).ToList();
                obj.Add(new OrderMasterChild 
                {
                    Master = i,
                    Childs = Child
                });
            }        


        }