22

我想通过关系从不同表中的数据库中检索数据,但是我收到一个我不知道如何处理的错误。

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:方法“First”只能用作最终查询操作。请考虑在此实例中使用“FirstOrDefault”方法。

问题出在.First()方法上,但如果我删除它,我就无法传递到另一个表。

4

2 回答 2

32

正如错误所述,您的解决方案是使用FirstOrDefault. 但是,null如果ProductName查询结果为空,这将返回,这意味着您将得到一个NullReferenceExceptionfrom 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();
于 2013-08-14T13:59:28.523 回答
1

该错误表明您应该使用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)

于 2013-08-14T12:45:35.513 回答