Как правильно читать одну строку данных с помощью Linq to SQL? - PullRequest
0 голосов
/ 27 октября 2009

Я очень новичок в Linq, я могу найти примеры многострочного чтения данных везде (с помощью foreach ()), но как правильно читать одну строку данных? Как классический Информация о товаре страница.

Ниже я попробовал:

var q = from c in db.Products
    where c.ProductId == ProductId
    select new { c.ProductName, c.ProductDescription, c.ProductPrice, c.ProductDate };

string strProductName = q.First().ProductName.ToString();
string strProductDescription = q.First().ProductDescription.ToString();
string strProductPrice = q.First().ProductPrice.ToString();
string strProductDate = q.First().ProductDate.ToString();

Код выглядит хорошо для меня, но когда я вижу фактические выражения SQL, сгенерированные с использованием SQL Profiler, меня это пугает! Программа выполнила четыре выражения Sql , и они точно такие же !

Потому что я читаю четыре столбца из одной строки. Я думаю, что я сделал что-то не так, поэтому мне было интересно, как правильно это сделать?

Спасибо!

Ответы [ 2 ]

9 голосов
/ 27 октября 2009

Использование метода расширения First () выдает System.InvalidOperationException, когда ни один элемент в последовательности не удовлетворяет указанному условию.

Если вы используете метод расширения FirstOrDefault(), вы можете проверить возвращаемый объект, чтобы увидеть, является ли он нулевым или нет.

FirstOrDefault возвращает первый элемент последовательности или значение по умолчанию, если последовательность не содержит элементов; в этом случае значение по умолчанию для продукта должно быть нулевым. Попытка получить доступ к свойствам этого нулевого объекта приведет к ArgumentNullException

var q = (from c in db.Products
    where c.ProductId == ProductId
    select new { c.ProductName, c.ProductDescription, c.ProductPrice, c.ProductDate }).FirstOrDefault();

if (q != null)
{
    string strProductName = q.ProductName;
    string strProductDescription = q.ProductDescription;
    string strProductPrice = q.ProductPrice;
    string strProductDate = q.ProductDate;
}

Кроме того, вам не нужно разыгрывать каждое свойство ToString(), если ваша объектная модель настроена правильно. ProductName, ProductDescription и т. Д. Уже должны быть строкой.

Причина, по которой вы получаете 4 отдельных запроса sql, заключается в том, что каждый раз, когда вы вызываете q.First().<PropertyHere>, linq генерирует новый запрос.

5 голосов
/ 27 октября 2009
var q = (from c in db.Products
         where c.ProductId == ProductId
         select new { c.ProductName, c.ProductDescription, c.ProductPrice, c.ProductDate }
        ).First ();

string strProductName = q.ProductName.ToString();
string strProductDescription = q.ProductDescription.ToString();
string strProductPrice = q.ProductPrice.ToString();
string strProductDate = q.ProductDate.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...