只有在添加where子句后,LINQ查询才会返回null引用

时间:2015-06-25 21:11:00

标签: c# .net sql-server linq

我在一个方法中有2个链式LINQ查询。第一个从表行中获取一个子字符串,其形式为" Person XXXX-XXXX被标记为已删除"并提取XXXX-XXXX部分并将它们放入包含XXXX-XXXX的对象中。

var ids = from m in _repo.GetMessages()
                       where m.tool == 7
                       select new IDs
                       {
                           ID = m.text.Substring(6, 11),
                           text = m.text
                       };

按预期返回数据。然后,ids加入随后的"结果"查询:

var results = from gs in _repo.GetSample()
                          join c in _repo.Getcenters() on gs.Iid equals c.Iid_c
                          join id in ids on gs.id equals id.ID
                          select new Results
                          {
                              c_id = c.id,
                              iid_d = gs.Iid_d,
                              Id = gs.id,
                              Num = gs.num,
                              sts_dt = c.sts_dt,
                              store_dte = gs.Store_dte,
                              quantity = gs.Quantity
                          };

此表单中的查询返回预期的数据,但我需要在结果查询中添加where子句。当我添加一个引用查询中任何数据对象的where子句时,输出会生成"对象引用未设置为对象的实例。"没有where子句,事情看起来很好。

我的第一个想法是第一个数据集中存在空项,所以我添加了一个!= null子句,它没有任何效果。然后我尝试用带有包含(ID)语句的ID替换连接,并且没有改变。由于我之前已经编写了许多链接的LINQ查询并且以这种方式链接它们没有问题,我的猜测是ID对象上的连接可能会导致一些奇怪的事情。有没有人对如何在不产生错误的情况下添加where子句有任何想法?谢谢!

2 个答案:

答案 0 :(得分:1)

在讨论了一段时间之后,我决定尝试将两个查询加在一起,这似乎解决了这个问题。为什么我没有做到这一点开始我不确定,但我猜测连接到前一个查询的输出触发了一个空对象警告。以下查询可以正常工作:

var results = from gs in _repo.GetSample()
                      join c in _repo.Getcenters() on gs.Iid equals c.Iid_c
                      join ids in _repo.GetLogs() on gs.id equals ids.text.Substring(6,11)
                      where gs.quantity > 0
                      select new Results
                      {
                          c_id = c.id,
                          iid_d = gs.Iid_d,
                          Id = gs.id,
                          Num = gs.num,
                          sts_dt = c.sts_dt,
                          store_dte = gs.Store_dte,
                          quantity = gs.Quantity
                      };

它也是一个更好,更紧凑的查询。谢谢大家!

答案 1 :(得分:0)

尝试Intern:byte[0];