C#EF DefaultIfEmpty with Where()。Select()

时间:2017-11-12 23:45:32

标签: c# entity-framework linq

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

e.g。

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

我可以将此转换为基于方法的语法,导航属性默认为null

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

我可以像(m.RefClass != null)?m.RefClass.TypeName:""那样做,但想知道是否有正确的方法来执行此操作,如上面的linq。

谢谢

3 个答案:

答案 0 :(得分: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 :(得分:0)

您可以尝试使用Include吗?

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

答案 2 :(得分:-1)

当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无效并且它没有抛出任何异常,它只返回没有行