Linq FirstOrDefault - 一个班轮

时间:2015-09-22 09:44:41

标签: c# linq c#-4.0

我有以下代码来确定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,但似乎没有用。

4 个答案:

答案 0 :(得分:16)

您可以使用Enumerable.DefaultIfEmpty的重载:

int Age = pList
    .Where(x => x.ID == "foo")
    .Select(x => x.Age)
    .DefaultIfEmpty(20)
    .First();

如您所见,FirstOrdefault不再需要了,因为如果输入序列为空(id-filter没有返回任何人),则会采用默认值。

答案 1 :(得分:5)

int Age = pList.Where(x => x.ID == "foo").FirstOrDefault()?.Age ?? 20;

仅限于C#6。

对于那些怀疑的人: enter image description here

答案 2 :(得分:4)

你可以这样做:

int Age = pList.Where(x => x.ID == "foo").Select(x=>(int?)x.Age).FirstOrDefault() ?? 20;

答案 3 :(得分:1)

无论如何,它并不漂亮,但你想尽可能地做到这一点,同时还要计算几个潜在的NullPointerExceptions。请不要在一个内衬中执行此操作,并且请不要使用int nullable来实现这一点。下面的代码并不漂亮,没有经过测试,因为我现在没有这种可能性。

请注意,我建议使用long if if语句以不同的方式执行此操作,以实现零代码重复和可读性。

Person person = ctx.Person.Where(x => x.Create > Date && x.ID.Equals("foo")).FirstOrDefault()

int age = (person != null) ? person.Age : 20;