我有以下代码来确定Person
var pList = ctx.Person.Where(x => x.Create > Date);
int Age = pList.Where(x => x.ID == "foo").FirstOrDefault().Age ?? 20;
我按ID选择Person
,如果不存在则默认值为20.
第二行无效,因为Age不能为null但是Person可以。有没有办法让这个工作在一行?我尝试过使用DefaultIfEmpty,但似乎没有用。
答案 0 :(得分:16)
您可以使用Enumerable.DefaultIfEmpty
的重载:
int Age = pList
.Where(x => x.ID == "foo")
.Select(x => x.Age)
.DefaultIfEmpty(20)
.First();
如您所见,FirstOrdefault
不再需要了,因为如果输入序列为空(id-filter没有返回任何人),则会采用默认值。
答案 1 :(得分:5)
答案 2 :(得分:4)
你可以这样做:
int Age = pList.Where(x => x.ID == "foo").Select(x=>(int?)x.Age).FirstOrDefault() ?? 20;
答案 3 :(得分:1)
请注意,我建议使用long if if语句以不同的方式执行此操作,以实现零代码重复和可读性。
Person person = ctx.Person.Where(x => x.Create > Date && x.ID.Equals("foo")).FirstOrDefault()
int age = (person != null) ? person.Age : 20;