【问题标题】:Cannot implicitly convert type '.List<AnonymousType#1>' to '.List<WebApplication2.Customer>'无法将类型“.List<AnonymousType#1>”隐式转换为“.List<WebApplication2.Customer>”
【发布时间】:2013-07-24 02:14:43
【问题描述】:

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

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&lt;AnonymousType#1&gt; 隐式转换为 System.Collections.Generic.List&lt;WebApplication2.Customer&gt;

这是为什么呢?

这是一个屏幕截图,显示了 Visual Studio 在错误提示中提供的一些附加信息:

返回一些列而不是整个表是正确的方法吗....?

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

【问题讨论】:

  • 将您的代码和异常粘贴为文本,而不是图像。
  • 您需要显式创建Customer 实例。 db.Customers 已经是 IEnumerable&lt;Customer&gt; 了吗?如果是这样,您为什么要重新选择这 4 个属性?只需返回db.Customers.ToList()。 (警告:您是否试图从您的数据库中无限制地检索 ALL 个客户?希望您没有太多的填充!)跨度>
  • 先生....实际上我只想从表中返回 4 个 coloms 而不是整个表...
  • @Hamid,你为什么只需要返回 4 列?
  • 先生,像 SQL 查询一样,返回这个 colom.. 我想在实体框架中做同样的事情.. 我想如果我返回整个表,执行表中的数据需要额外的时间...

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


【解决方案1】:

当您查看代码时:

x => new { ... }

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

return db.Customers.ToList();

这假定CustomersIEnumerable&lt;Customer&gt;,它应该与您尝试返回的内容相匹配。

编辑

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

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

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

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

【讨论】:

  • ...除非db.Customers 不是IEnumerable&lt;Customer&gt;
  • @MarkAvenius,是的,这只是一个假设。我希望有这样的命名约定。
  • @gunr2171 救了我的星期五谢谢!
【解决方案2】:

您正在选择匿名类型,它不是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&lt;ShrunkenCustomer&gt;(假设 ShunkenCustomer 是您为新类选择的名称。)

【讨论】:

  • good.......先生,我可以这样做,因为它没有显示错误.. public object GeAllCust() { var results = db.Customers.Select (x => new { x.CustName, x.CustEmail, x.CustAddress, x.CustContactNo }).ToList();返回结果; }
  • 编译器会让你,但你不能访问属性,因为你不能将你的object 转换成任何东西。匿名类型 (new { ... }) 仅在其给定范围内有效(在这种情况下,直到您离开您的方法。)从技术上讲,您可以为此使用 dynamic,但我不推荐它,因为这样您会丢失编译器的帮助(编译器错误会消失,但你会得到运行时错误。)
  • 我编译程序,它什么也没显示.....错误.......它显示了四个coloms的列表 GridView1.DataSource = new ConnectionDAL().GeAllCust(); GridView1.DataBind();
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 这让我很开心!
      猜你喜欢
      • 1970-01-01
      • 2013-05-14
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多