首页 文章

C#EF DefaultIfEmpty with Where() . 选择()

提问于
浏览
0

是否有类似于我们可以使用linq为左外连接与基于方法的查询语法 .

例如

var a = from m in context.MainClass
        join r in context.RefClass on m.RefID equals r.ID on joinedent
        from j in joinedent.DefaultIfEmpt()
        select new { m.Name , j.TypeName }

如果为null,我可以将其转换为基于方法的语法,导航属性为default

var a = context.MainClass.Select(x=> new {
               m.Name
               m.RefClass.TypeName // here need default if RefClass is null 
        })

我可以像_797583那样做,但想知道是否有一种正确的方式像上面的linq那样做 .

谢谢

3 回答

  • -1

    只需在DefaultIfEmpty参数中使用新的初始化

    var a = from m in context.MainClass
        join r in context.RefClass on m.RefID equals r.ID on joinedent
        from j in joinedent.DefaultIfEmpt(new RefClass())
        select new { m.Name , j.TypeName }
    

    希望问题能解决

  • 1

    你能试试 Include 吗?

    var a = context.MainClass.Include("RefClass")
                             .Select(x => new {
                                 m.Name
                                 m.RefClass.TypeName // here need default if RefClass is null 
                             })
    
  • 0

    当EF对数据库执行Linq时,m.RefClass.TypeName将返回#null,其中针对对象的相同语句将抛出NullReferenceException .

    m.RefClass?.TypeName 应该在两种情况下都返回string.Empty .

    更新:如上所述?表达式树中不允许使用,但以下方法有效:

    var a = context.MainClass.Select(x=> new {
                   m.Name
                   TypeName = m.RefClass.TypeName ?? "" 
            })
    

    对于子引用为null而不是空引用异常的属性,EF表达式将返回#null . 但是,如果以某种方式复制/移动表达式而不是通过EF运行表达式,则检查RefClass的null会更安全 .

    在一个奇怪的旁注中,我在测试时遇到了一个有趣的副作用:只有在父和子之间的关系被映射为可选时才能正常工作 . (显然)在我的情况下,我有一个现有的测试关系,设置为“必需”或不可空 . 我更改了模式以使子ID无效,并且它没有抛出任何异常,它只返回没有行

相关问题