代码之家  ›  专栏  ›  技术社区  ›  BlueRaja - Danny Pflughoeft

LINQ到实体-空引用

  •  0
  • BlueRaja - Danny Pflughoeft  · 技术社区  · 15 年前

    我敢发誓前几天起作用了:

    var resultSet =
        (from o in _entities.Table1
         where o.Table2.Table3.SomeColumn == SomeProperty
         select o
        ).First();
    SelectedItem = resultSet.Table2.SomeOtherColumn;
    

    最后一行出现空引用异常:resultset.table2为空。
    我不仅确定所有外键和其他项都没有正确的值,而且我看不到表2 能够 为空,因为 o.Table2.Table3.SomeColumn == SomeProperty .

    结果集具有所有正确的值 ,但表2为空除外。

    [编辑] 这工作:

    SelectedItem = _entities.Table2.First(
        o => o.Table2.SomeColumn == SomeProperty).SomeOtherColumn;  
    

    而且,上面, resultSet 具有所有正确的值,因此数据库中的数据不存在问题;linq to实体只是做错了什么。

    2 回复  |  直到 15 年前
        1
  •  5
  •   BlueRaja - Danny Pflughoeft    15 年前

    对实体的依赖只是做错了什么。

    不,它按设计工作。L2E只会 JOIN 当你强迫它的时候。这样可以提高性能。只要你在L2E,你就可以参考任何关系。这就是为什么这样做:

    SelectedItem = _entities.Table2.First(
        o => o.Table2.SomeColumn == SomeProperty).SomeOtherColumn;  
    

    这里的lambda表达式将由linq解释为实体,并转换为sql。另一方面,这:

    var resultSet =
        (from o in _entities.Table1
         where o.Table2.Table3.SomeColumn == SomeProperty
         select o
        ).First();
    SelectedItem = resultSet.Table2.SomeOtherColumn;
    

    …给出类型的结果 Table1 . 你现在在物体空间。因为你的查询没有强制 Table2 要加载,l2e不会为它生成sql列。当您不需要 表2 . 当你这样做的时候,你必须这样说:

    var resultSet =
        (from o in _entities.Table1.Include("Table2")
         where o.Table2.Table3.SomeColumn == SomeProperty
         select o
        ).First();
    
    SelectedItem = resultSet.Table2.SomeOtherColumn;
    

    这会奏效的。 然而 你的 First(lambda) 上面的方法是 更好的解决办法 . (比较SQL。)

        2
  •  0
  •   Russell Steen    15 年前

    第一次可能什么也不回。您确定数据集的someColumn中存在someProperty的值吗?

    用if using.any()将整个东西包装起来,以确定是否有记录,或者在resultset.table2上测试null