在以下代码中返回一个列表:
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;
}
答案 0 :(得分:20)
当您查看代码时:
x => new { ... }
这会创建一个新的anonymous type。如果您不需要仅撤回特定的一组列,则可以执行以下操作:
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;
}
这将有效,然而,您将失去与数据库上下文的所有关系。这意味着如果您更新返回的值,它将不会将其重新粘贴到数据库中。
另外,只是重复我的注释,返回更多列(字节数组除外)并不一定意味着更长的执行时间。返回大量行意味着更多的执行时间。您的功能是返回数据库中的每个客户,当您的系统增长时,即使数量减少,也会开始挂起您的程序。
答案 1 :(得分:6)
您选择的是匿名类型,而不是Customer
。
如果你想这样做(有点),你可以这样写:
return db.Customers.Select(x => new Customer { Name = x.CustName, Email = x.CustEmail, Address = x.CustAddress, ContactNo = x.ContactNo }).ToList();
这假定Customer
对象上的属性是我称之为的对象。
**编辑**根据您的评论,
如果要返回表的子集,可以执行以下两项操作之一:
Customer
的翻译后的表格,或者: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
});
}
}