Arhn - архитектура программирования

Как определяется тип возвращаемого значения в методе, использующем Linq2Sql?

Когда дело доходит до linq, у меня обычно возникают трудности с возвращаемыми типами. Я объясню на следующих примерах. Допустим, у меня есть таблица Товары с идентификатором продукта, названием, категорией и ценой в виде столбцов:

1) IQueryable ‹*** Продукт *> **

public IQueryable<Product> GetChildrenProducts()
{
  return (from pd in db.Products
          where pd.Category == "Children"
          select pd);
}

2) Товар

public Product GetProduct(int id)
{
  return (from pd in db.Products
          where pd.ProductID == id
          select pd).FirstOrDefault();
}

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

Я имею в виду это:

public returnType GetSomeInformation()
{
 return (from pd in db.Products
         select new { pd.Name, pd.Price }
}

ЧТО ДОЛЖНО БЫТЬ returnType для GetSomeInformation ()?

Спасибо за помощь

31.03.2010

Ответы:


1

Вы не можете использовать var в этом контексте, поскольку тип в настоящее время может быть выведен только в локальных переменных.

Так что либо:

Переместите часть Select() к вызывающей стороне и верните простой IQueryable<Product>:

public IQueryable<Product> GetSomeInformation()
{
  return (from pd in db.Products
          select pd);
}

var information = GetProductInformation().Select(p => new { p.Name, p.Price });

Создайте ответный тип ProductInformation, который будет содержать только необходимую информацию:

class ProductInformation
{
  public string Name { get; set; }
  public decimal Price { get; set; }
}

public IQueryable<ProductInformation> GetSomeInformation()
{
  return (from pd in db.Products
          select new ProductInformation { Name=pd.Name, Price=pd.Price });
}
31.03.2010
  • @Yannick M. - Если я решу запросить ProductID и Category (вместо Name и Price), нужно ли мне создать другой класс, содержащий 2 столбца? 31.03.2010
  • Вы могли бы, если хотите, чтобы ваш класс содержал все четыре поля, и, если хотите, установите только те поля, которые вам нужно использовать. Или вы можете создать несколько классов на основе полей, которые вы возвращаете для каждого запроса LINQ. 31.03.2010
  • Я предпочитаю первый вариант, т.е. иметь только один класс и устанавливать нужные поля. Если это правда, (i) могу ли я использовать Product вместо ProductInformation в приведенном выше примере? (ii0 Если я могу использовать Product вместо ProductInformation, нужно ли мне «Name = pd.Name» вместо «Name»? 01.04.2010
  • Кроме того, из приведенного выше оператора var information = GetProductInformation (). Выберите (p = ›new {p.Name, p.Price}, как я могу использовать динамический запрос (строку) для замены p =› new {p.Name, p .Цена строкой. Как мне это сделать? 01.04.2010
  • Для этого загляните в Dynamic Linq: weblogs.asp.net/scottgu/archive/2008/01/07/ 01.04.2010

  • 2

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

    public class MyObject
    {
      public string Name { get; set; }
      public double Price { get; set; }
    }
    
    public MyObject GetSomeInformation()
    {
     return (from pd in db.Products
             select new  MyObject {
               Name = pd.Name, 
               Price = pd.Price 
             }).FirstOrDefault();
    }
    
    31.03.2010
  • @Charles Boyung - Как насчет того, чтобы я решил запросить только один столбец (например, выберите pd.name). Нужно ли мне создавать класс из одного свойства? или я могу использовать простые типы, такие как string, int, bool и т. д.? 31.03.2010
  • Да, если вам нужен только один столбец, вы можете просто использовать любой .Net-тип столбца. Если вы не уверены, VS intellisense для этого столбца сообщит вам тип во время написания кода. 31.03.2010

  • 3

    Краткий ответ: IEnumerable.

    Длинный ответ:

    Вы возвращаете коллекцию анонимного типа, следовательно, необходимо, чтобы возвращаемый тип был IEnumerable.

    31.03.2010
  • И как бы вы предложили добраться до значений свойств нетипизированного анонимного типа? (Не говори размышления ;-) 31.03.2010
  • Я просто ненавижу в C # отсутствие динамического разрешения членов. VB.NET имеет это, начиная с .NET 1.0. Это неприятно. А теперь все говорят о динамике как о втором пришествии. Боже ... это было уже много лет. 31.03.2010
  • Tbh, я рассматриваю реализацию DLR только как средство для достижения цели. Это позволяет мне меньше раздражать COM-взаимодействие и обращаться к динамическим языковым ресурсам. Но я не думаю, что использую ключевое слово dynamic для чего-то еще. 31.03.2010
  • Из всех причин использовать динамическое разрешение элементов это будет одной из худших. Было бы здорово, если бы алгоритм вывода типов позволял вам возвращать типизированный результат без объявления класса. 31.03.2010
  • @erikkallen, дело в том, Эрик, что у VB есть такие вещи с VB 3 для Win 3.1 и VB.NET с 1.0. Все разрешение выполняется динамически. Конечно, вы не можете создать нового члена, как это можно сделать с динамическими типами, но вы можете вызвать любой существующий член, какой захотите. 31.03.2010
  • @Paulo - и это одна из самых больших проблем, с которыми сталкиваются многие программисты с VB. Я лично терпеть не могу, что C # добавляет динамические типы, в этом нет реальной необходимости. Я тоже ненавижу var, так как слишком много ленивых программистов решили просто объявить что-нибудь как var, даже если они сразу знают точный тип. Достаточно взглянуть на любой учебник по .Net или сообщение в блоге - чистое ленивое кодирование. 31.03.2010
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..