是否有类似于我们可以使用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。
谢谢
答案 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无效并且它没有抛出任何异常,它只返回没有行