Linq to Entities:简单选择的NullReferenceException

时间:2010-10-27 16:45:24

标签: linq-to-entities nullreferenceexception

我有以下句子:

var customers = from customer in Context.ps_customer
                select customer;

正如你所看到的,它是世界上最简单的句子。好吧,它抛出一个NullReferenceException,我不知道为什么。实际上,异常是在

引发的
List<ps_customer> clientes = customers.ToList<ps_customer>();

但如果我在Linq句子中设置断点并尝试查看客户值,则会出现NullReferenceException。

有没有人知道为什么我会得到这个例外?

编辑:我将提供更多信息:

MyEntityModel Context = new MyEntityModel();

var solicitudes = from  solicitud in Context.ps_orders
                  where solicitud.date_add.Year == fecha.Year &&
                        solicitud.date_add.Month == fecha.Month &&
                        solicitud.date_add.Day == fecha.Day
                  select solicitud;

//This return correct data
ps_orders orden = solicitudes.ToList<ps_orders>().FirstOrDefault(); 

var customers = from customer in Context.ps_customer
                where customer.id_customer == orden.id_customer
                select customer;

var orden_detalles = from oDetalle in Context.ps_order_detail
                     where oDetalle.id_order == orden.id_order
                     select oDetalle;

var direcciones = from oDireccion in Context.ps_address
                  where oDireccion.id_address == orden.id_address_delivery
                  select oDireccion;

ps_address direccion = direcciones.FirstOrDefault(); //Correct data
List<ps_order_detail> detalles = orden_detalles.ToList<ps_order_detail>(); //Correct data
ps_customer clientes = customers.FirstOrDefault(); //NullReferenceException

我完全相信ps_customer有数据,2行是特定的,我已经从.edmx中删除了ps_customer实体并且我再次添加了它,它仍然会发生

非常感谢!

编辑2: 我已经复制了表的create语句,创建了一个名为customerTwo的新表,插入了新数据,但它仍然失败...顺便说一下,我正在使用MySQL,而DataBase是由Prestashop创建的,以防万一很有用......

4 个答案:

答案 0 :(得分:0)

您收到此异常是因为在评估LINQ查询时Context.ps_customer为null。根据您的第二行代码,您的查询应如下所示:

var customers = from customer in clientes
                select customer;

但是,既然你没有提供很多细节,我不能说这肯定是问题。

答案 1 :(得分:0)

编辑: 试试这个查询 -

var customers = (from c in Context.ps_customer
                select c).ToList();

如果c返回Count = 0,则表示您的表没有任何条目。所以这就是为什么null问题...反正我会建议仔细调试......并确定它究竟在哪里抛出异常,有时你只是在问题可能与其他东西时看错了。

原文: customers已空。显然,出于某种原因,您的表ps_customer返回null表示您确定数据和模型是正确的...也可能值得查看您的代码。 .my猜测你的上下文是否为空

答案 2 :(得分:0)

我会在看完你的编辑后发布另一个答案。

我看到的问题是你假设从这里返回的值:

ps_orders orden = solicitudes.ToList<ps_orders>().FirstOrDefault(); 

将具有id_customer的值,该值与Context.ps_customer中的一行或多行匹配,这是错误的,因为它容易删除异常(即:如果FirstOrDefault()返回的顺序是指已从数据库中删除的客户,那么您的客户查询将不会返回任何结果。)

我建议使用另一种查询方法,也许加入两个表而不是尝试匹配id_customer的特定值,如下所示:

//disclaimer: I'm primarily a SQL dev, not LINQ or EF, so this syntax may be wrong
var customers = from customer in Context.ps_customer
join orden in solicitudes
on customer.id_customer == orden.id_customer
select customer;

答案 3 :(得分:0)

在我看来ps_orders orden = solicitudes.ToList<ps_orders>().FirstOrDefault(); 正在返回null。在您因延期评估而尝试评估customers.FirstOrDefault()之前,您才会看到它。我建议验证是否正确定义了关怀。

此外,您可能需要考虑通过合并查询来减少数据库流量,可以将FirstOrDefault()直接应用于实体查询,这通常会转换为SELECT TOP 1查询。将其与ToList().FirstOrDefault()进行对比,{{1}}对数据库说“给我一切”,然后选择第一条记录。只是小费!