无法将类型'.List <AnonymousType#1>'隐式转换为'.List <WebApplication2.Customer>'

Aya*_*ifa 14 c# linq asp.net entity-framework

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

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

我收到错误报告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;
}
Run Code Online (Sandbox Code Playgroud)

gun*_*171 20

当你看代码时:

x => new { ... }
Run Code Online (Sandbox Code Playgroud)

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

return db.Customers.ToList();
Run Code Online (Sandbox Code Playgroud)

这假设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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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


Mar*_*ius 6

您正在选择匿名类型,而不是Customer.

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

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

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

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

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

  1. 返回Customer我上面指定的翻译形式,或者:
  2. 为您的业务层创建一个只有这四个字段的新类,并更改您的方法以返回a List<ShrunkenCustomer>(假设ShunkenCustomer您为新类选择的名称.)