该SingleOrDefault()
方法很棒,因为如果您调用它的集合为空,它不会抛出异常.但是,有时我想要的是获取某种类型的新对象(如果不存在).例如,如果我能做到以下几点会很棒:
var client = db.Clients .Where(c => c.Name == "Some Client") .SingleOrNew();
这样我就不必检查它null
是否是创建一个新的,我总是知道我的client
对象将是我可以立即使用的东西.
有任何想法吗?
真的,你只想在这里使用null合并算子.例:
var client = db.Clients .Where(c => c.Name == "Some Client") .SingleOrDefault() ?? new Client();
这将返回SingleOrDefault返回的任何内容,但如果SingleOrDefault返回null,则表达式返回新的Client().
编辑:正如John Skeet指出的那样,这个解决方案没有区分没有匹配的情况和找到空元素的情况,但显然在许多情况下这不一定是个问题.另一种方法是创建如下的扩展方法.
public static T SingleOrNew(this IEnumerable query) where T : new() { try { return query.Single(); } catch (InvalidOperationException) { return new T(); } }
我想说这可能是一般案例中最优雅的解决方案.
如果你想要完成的只是覆盖默认值(并返回一个新对象),你可以在调用SingleOrDefault()之前使用DefaultIfEmpty()方法.就像是:
var client = db.Clients .Where(c => c.Name == name) .DefaultIfEmpty(new Client { Name = name }) .SingleOrDefault();