无法将类型’.List ‘隐式转换为’.List ‘

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

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

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

错误:无法将类型System.Collections.Generic.List隐式转换为System.Collections.Generic.List

这是为什么?

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

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

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

当你看代码时:

 x => new { ... } 

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

 return db.Customers.ToList(); 

这假设CustomersIEnumerable ,它应该与您尝试返回的内容相匹配。

编辑

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

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

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

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

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

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

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

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

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

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

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

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

基本上无论你在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 ob = new List(); 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 }); } }