Невозможно неявно преобразовать тип '.List <AnonymousType # 1>' в '.List <WebApplication2.Customer>' - программирование
Подтвердить что ты не робот

Невозможно неявно преобразовать тип '.List <AnonymousType # 1>' в '.List <WebApplication2.Customer>'

В следующем коде, который возвращает список:

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

Я получаю сообщение об ошибке, что С# не может преобразовать список:

Ошибка: не может неявно преобразовать тип 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;
}
4b9b3361

Ответ 1

Когда вы смотрите код:

x => new { ... }

Это создает новый анонимный тип. Если вам не нужно отбрасывать только определенный набор столбцов, вы можете просто сделать следующее:

return db.Customers.ToList();

Это предполагает, что Customers является IEnumerable<Customer>, который должен совпадать с тем, что вы пытаетесь вернуть.

Edit

Вы отметили, что хотите вернуть только определенное подмножество столбцов. Если вы хотите, чтобы какой-либо компилятор помогал при кодировании, вам нужно создать собственный класс для хранения значений:

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

Это будет работать, однако, вы потеряете все отношения к контексту базы данных. Это означает, что если вы обновите возвращаемые значения, он не вернет его обратно в базу данных.

Также, чтобы повторить мой комментарий, возврат большего количества столбцов (за исключением массивов байтов) не обязательно означает более длительное время выполнения. Возвращение большого количества строк означает большее время выполнения. Ваша функция возвращает каждого отдельного клиента в базе данных, который, когда ваша система растет, начнет зависать вашу программу даже при уменьшенном количестве столбцов.

Ответ 2

Вы выбираете анонимный тип, который не является Customer.

Если вы хотите сделать это (сорт), вы можете записать его следующим образом:

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

Это предполагает, что свойства вашего объекта Customer - это то, что я их назвал.

** EDIT ** За ваш комментарий

Если вы хотите вернуть подмножество таблицы, вы можете сделать одну из двух вещей:

  • Верните переведенную форму Customer, как указано выше, или:
  • Создайте новый класс для вашего бизнес-уровня, который содержит только эти четыре поля, и измените свой метод на возврат List<ShrunkenCustomer> (предполагается, что ShunkenCustomer - это имя, которое вы выбрали для своего нового класса.)

Ответ 3

GetAllCust() должен возвращать список Customer, Select New создаст список анонимных типов, вам нужно вернуть список клиентов из вашего запроса. попробуйте:

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 var, зациклитесь на этом и сохраните его в списке < > object, затем зацикливайте и достигните ur target.Here я отправляю код для основных деталей. Список obj = новый 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
                });
            }        


        }