如果LINQ to实体查询未返回任何值,那么如何返回默认值

pup*_*eno 11 linq linq-to-entities entity-framework defaultifempty

在这样的LINQ to实体表达式中:

var vote = (from vote in db.Vote where
    vote.Voter.Id == user.Id
    select v).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

如何添加DefaultIfEmpty值,以便在没有投票时我会得到一个默认值?

Rob*_*ney 18

另一种方法,如果Vote是引用类型,因此使用null作为其默认值,将使用null合并运算符:

var vote = (db.Vote
   .Where(v => v.Voter.Id == user.Id)
   .FirstOrDefault()) ?? defaultVote;
Run Code Online (Sandbox Code Playgroud)


dri*_*iis 5

添加自己的扩展方法.例如:

public static class Extension
{
    public static T FirstOrDefault(this IEnumerable<T> sequence, T defaultValue)
    { 
        return sequence.Any() ? sequence.First() : defaultValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

在该范围内,您可以说:

var vote = (from vote in db.Vote where
    vote.Voter.Id == user.Id
    select v).FirstOrDefault(yourDefaultValue);
Run Code Online (Sandbox Code Playgroud)

当然,你的方法也可以有一个返回默认值(T)的重载,如果那是你要找的地方.已经在内置的Extension类中定义了一个DefaultIfEmpty扩展方法,所以我在示例"FirstOrDefault"中命名了该方法,这似乎更合适.


pup*_*eno 1

我最终采用了一种非常简单的方法,这是由此处的答案推荐的,但后来被删除了:

var vote = (from vote in db.Vote 
            where vote.Voter.Id == user.Id
            select v).FirstOrDefault();
if (vote == null) {
    vote = new Vote() { .... };
    db.AddToVoteSet(vote);
}
Run Code Online (Sandbox Code Playgroud)