Подтвердить что ты не робот

Как обрабатывать метод ошибки "Первый" может использоваться только как конечная операция запроса "

Я хочу получить данные из базы данных в разных таблицах по соотношению, но я получаю сообщение об ошибке, которое я не знаю, как обращаться.

int customer_id = int.Parse(this.comboBoxnamecustomer.SelectedValue.ToString());

a = (from c in db.Invoices where c.CustomerID == customer_id select new { 
        customerName = c.Customer.Name,
        ProductName = c.InvoiceItems
            .Where(x => x.InvoiceId == c.InvoiceId)
            .First().Product.ProductsName.Name
    }).ToList();

Необработанное исключение: System.NotSupportedException: метод "Первый" может использоваться только как конечная операция запроса. Вместо этого рассмотрите возможность использования метода FirstOrDefault в этом случае.

Проблема заключается в методе .First(), но если я его удалю, я не могу перейти в другую таблицу.

4b9b3361

Ответ 1

Ваше решение, как говорится в ошибке, - использовать FirstOrDefault. Это, однако, вернет null, если результат запроса ProductName пуст, что означает, что вы получите NullReferenceException из FirstOrDefault().Product.ProductsName.Name. Это решается путем перемещения преобразования свойств ранее в запросе перед вызовом FirstOrDefault():

a = (from c in db.Invoices where c.CustomerID == customer_id select new { 
     customerName=c.Customer.Name,
     ProductName=c.InvoiceItems.Where(x=> x.InvoiceId==c.InvoiceId)
                               .Select(i => i.Product.ProductsName.Name)
                               .FirstOrDefault()
}).ToList();

Ответ 2

Ошибка указывает, что вы должны использовать FirstOrDefault() вместо First()

Не уверен, что вопрос

int customer_id = int.Parse(this.comboBoxnamecustomer.SelectedValue.ToString());

a = (from c in db.Invoices where c.CustomerID == customer_id select new { 
         customerName=c.Customer.Name,ProductName=c.InvoiceItems.Where(x=> x.InvoiceId==c.InvoiceId).FirstOrDefault().Product.ProductsName.Name
        }).ToList();
        dataGridViekryar.DataSource = a;

Конечно, это вызовет ошибку, если в вашем запросе нет элементов (исключение NullReferenceException)