20

在以下返回列表的代码中:

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;
}
4

5 回答 5

27

当您查看代码时:

x => new { ... }

这将创建一个新的匿名类型。如果您不需要仅拉回一组特定的列,则可以执行以下操作:

return db.Customers.ToList();

这假设它Customers是一个IEnumerable<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;
}

这将起作用,但是,您将失去与数据库上下文的所有关系。这意味着如果您更新返回的值,它不会将其粘回到数据库中。

此外,只是重复我的评论,返回更多列(字节数组除外)并不一定意味着更长的执行时间。返回很多行意味着更多的执行时间。您的函数正在返回数据库中的每个客户,当您的系统增长时,即使列数减少,它也会开始挂起您的程序。

于 2013-07-24T14:28:08.617 回答
7

您正在选择匿名类型,它不是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是您为新类选择的名称。)
于 2013-07-24T14:25:26.657 回答
4

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

var results = db.Customers.Select( new Customer{CustName = x.CustName}).ToList(); //include other fields
于 2013-07-24T14:26:04.160 回答
1

我猜Customer是你自己定义的一个类?我的建议是执行以下操作:

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

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

于 2013-07-24T14:29:41.257 回答
1

基本上无论你在 var 类型中得到什么,循环并将其存储在 list<> 对象中,然后循环并实现你的目标。我在这里发布 Master 详细信息的代码。列表 obj = 新列表();

        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
                });
            }        


        }
于 2017-12-07T09:23:11.910 回答