вернуть цену товара с помощью LINQ, какой тип возврата использовать в функции? - PullRequest
1 голос
/ 22 сентября 2011

Я только начинаю работать с LINQ и пытаюсь выбрать и вернуть цену продукта из базы данных, например:

public int GetPricePerKg(Product prod)
{
    var result = from p in dc.Products
                 where p.pk_product_id == prod.pk_product_id
                 select p.product_price_kg;
    return result;
}

Это дает мне ошибку:

Не удается неявно преобразовать тип 'System.Linq.IQueryable<int?>' в 'int'

Какой лучший способ справиться с этим?Мне нужна цена (в данном случае int), и я делаю некоторые расчеты с ней в другом месте

спасибо!

Ответы [ 4 ]

3 голосов
/ 22 сентября 2011

Итак, вы выбрали запрос - который теоретически может соответствовать 0, 1 или более записям.Что вы хотите сделать в каждой ситуации?Кроме того, похоже, что product_price_kg - это int? - что вы хотите сделать, если оно пустое?

Вы могли бы хотеть:

public int GetPricePerKg(Product prod)
{
    return dc.Products.Where(p => p.pk_product_id == prod.pk_product_id)
                      .Select(p => p.product_price_kg)
                      .Single()
                      .Value;
}

..... но это вызовет исключение, если либо не существует ни одного совпадающего продукта или свойство цены равно нулю.

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

return (from p in dc.Products
        where p.pk_product_id == prod.pk_product_id
        select p.product_price_kg).Single().Value;

В качестве альтернативы вы можете использовать версию Single(), которая принимает предикат, например:

return dc.Products.Single(p => p.pk_product_id == prod.pk_product_id)
                  .product_price_kg.Value;

Нет никаких сомнений в других вариантах -все они будут делать одно и то же - выберите тот, который вам наиболее удобен для чтения.

РЕДАКТИРОВАТЬ: вместо Single есть другие варианты:

  • First (справиться с 1или более)
  • FirstOrDefault (справиться с 0, 1 или более)
  • SingleOrDefault (справиться с 0 или 1)

Для OrDefault версии, которые вам нужно решить, что делать, если вы не подходите ни к одному из продуктов.

2 голосов
/ 22 сентября 2011

вам нужно сделать (если вы хотите только первый матч обратно)

public int GetPricePerKg(Product prod)
    {
        var result = (from p in dc.Products
                     where p.pk_product_id == prod.pk_product_id
                     select p.product_price_kg).FirstOrDefault();
        return result;
    }
1 голос
/ 22 сентября 2011

И Джон Скит, и Садж правы в своих ответах. Вот еще один альтернативный синтаксис, более соответствующий приведенному вами коду:

public int GetPricePerKg(Product prod)
{
    var result = from p in dc.Products
                 where p.pk_product_id == prod.pk_product_id
                 select p.product_price_kg;
    return result.FirstOrDefault();
}
0 голосов
/ 22 сентября 2011

Вы должны использовать FristOrDefault() метод расширения

public int GetPricePerKg(Product prod)
{
    var result = (from p in dc.Products
                 where p.pk_product_id == prod.pk_product_id
                 select p.product_price_kg).FirstOrDefault();
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...