Оператор возврата LINQ to SQL - PullRequest
1 голос
/ 24 января 2012

В проекте у меня есть класс LINQ to SQL, который называется OrderingSystem.dbml.У меня есть следующий код, и в операторе выбора я хочу получить только некоторые строки из каждой таблицы (Продукты - Категории).Но, конечно, обратное утверждение, которое у меня есть сейчас, неверно.Какое правильное выражение возврата использовать ??Заранее спасибо


    OrderingSystemDataContext database = new OrderingSystemDataContext();

    public List<Product> GetProductsByCategoryID(int CategoryID)
    {
        var result = from p in database.Products
        join c in database.Categories
        on p.CategoryID equals c.CategoryID
        where p.CategoryID == CategoryID
        select new { p.ProductName, p.ProductPrice, p.ProductDescription, c.CategoryName };

        //This is not working
        return result.ToList();
    }

Ответы [ 4 ]

1 голос
/ 24 января 2012

При выборе нового вы должны указать тип, если затем вы хотите получить список продуктов, сейчас он создает анонимный тип.Попробуйте изменить с помощью:

OrderingSystemDataContext database = new OrderingSystemDataContext();

public List<Product> GetProductsByCategoryID(int CategoryID)
{
    var result = from p in database.Products
    join c in database.Categories
    on p.CategoryID equals c.CategoryID
    where p.CategoryID == CategoryID
    //Assuming that these are the names of your properties
    select new Product(){ProductName = p.ProductName, ProductPrice = p.ProductPrice, ProductDescription = p.ProductDescription, CategoryName = c.CategoryName };

    return result.ToList();
}
0 голосов
/ 24 января 2012

Используя операцию «выбрать новый» LINQ, вы создаете анонимный тип.Вы можете получить доступ к свойствам этого анонимного типа в текущей области создания объектов, но вы не можете вернуть этот анонимный тип, используя любой тип распознаваемого типа.У вас есть два варианта:

  1. Создать новый класс (например, Product) и создать экземпляры этого типа как часть вашего оператора выбора (как указано в других ответах)
  2. Вернуть коллекциюкак List<object>.Если вы сделаете это, вы все равно сможете извлечь значения из объектов, но вам нужно будет сделать это с помощью отражения.Это может быть вполне допустимо, если вы используете коллекцию в качестве источника данных в сценарии привязки данных.
0 голосов
/ 24 января 2012

Это потому, что в выражении LINQ вы сделали select new { }, который создает анонимный объект, в то время как ваш метод возвращает список Product. Вы должны изменить оператор select, чтобы он стал select new Product() { ProductName = p.ProductName, ..., остальное зависит от структуры вашего Product класса.

0 голосов
/ 24 января 2012

Тип возврата: продукт, но в результате запроса используется анонимный тип.

Измените эту строку:

select new { p.ProductName, p.ProductPrice, p.ProductDescription, c.CategoryName };

на что-то вроде этого:

select new Product { Name = p.ProductName, Price = p.ProductPrice, Description = p.ProductDescription, Category = c.CategoryName };

РЕДАКТИРОВАТЬ:

Попробуйте просто заменить его на:

select p;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...