Передача анонимных типов в ASP.NET MVC

2

Я использую ASP.net MVC с С#. Почему это код:

public IQueryable<Product> ListProducts(string prodcutType)
{
    var results = from p in db.Products
        join s in db.Stocks
        on p.ID equals s.IDProduct
        where p.ptype == prodcutType
        select new { s.width, s.height, s.number};                 
    return results;
}

отображается следующая ошибка?

Ошибка 1 Невозможно неявно преобразовать тип System.Linq.IQueryable<AnonymousType#1>в System.Linq.IQueryable<eim.Models.Product>. Явное преобразование существует (вы отсутствует листинг?)

Теги:
asp.net-mvc
linq-to-sql

2 ответа

8
Лучший ответ

Потому что select new { s.width, s.height, s.number} означает System.Linq.IQueryable<AnonymousType#1>, но ваша функция ожидает возврата IQueryable<Product>. Измените свой код на:

public IQueryable<Product> ListProducts(string prodcutType)
{

    var results = from p in db.Products
                  join s in db.Stocks
                  on p.ID equals s.IDProduct
                  where p.ptype == prodcutType
                  select p;
    return results;
}

ОБНОВЛЕНО:

Или, может быть, вы хотите IQueryable<Stock>:

public IQueryable<Stock> ListProducts(string prodcutType)
{

    var results = from p in db.Products
                  join s in db.Stocks
                  on p.ID equals s.IDProduct
                  where p.ptype == prodcutType
                  select s;
    return results;
}

Если вы хотите только 3 свойства width + height + number, создайте новый тип. Например:

public class SomeType {
    public int Width { get; set; }
    public int Height { get; set; }
    public int Number { get; set; }
}

public IQueryable<SomeType> ListProducts(string prodcutType)
{

    var results = from p in db.Products
                  join s in db.Stocks
                  on p.ID equals s.IDProduct
                  where p.ptype == prodcutType
                  select new SomeType {
                      Width = s.width,
                      Height = s.height,
                      Number = s.number
                  };
    return results;
}
1

Последняя строка вашего запроса LINQ

select new { s.width, s.height, s.number};     

выберет только эти три поля из вашей таблицы "db.Stocks", и это создаст новый анонимный тип, который будет храниться в "результатах" и передан обратно.

То, что вы возвращаете в "результатах возврата"; поэтому не a IQueryable<Product> - это нечто совершенно другое (это IQueryable анонимного типа).

Если вы хотите вернуть продукты, вам нужно будет указать этот анонимный тип в "Продукт" (или создать новый класс продукта из выбранных полей).

Марк

Ещё вопросы

Сообщество Overcoder
Наверх
Меню