Как определяется тип возвращаемого значения в методе, который использует Linq2Sql? - PullRequest
0 голосов
/ 31 марта 2010

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

1) IQueryable <*** Продукт *</strong>> **

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 столбца (Имя и Цена), но в любом случае меньше 4 столбцов, что будет тип возвращаемого значения?

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 31 марта 2010

Если вы выбрали несколько столбцов, но не полный объект, 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();
}
2 голосов
/ 31 марта 2010

Вы не можете использовать 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 });

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

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 });
}
0 голосов
/ 31 марта 2010

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

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

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

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