当前位置:  开发笔记 > 编程语言 > 正文

LINQ中的SingleOrNew()方法而不是SingleOrDefault()怎么样?

如何解决《LINQ中的SingleOrNew()方法而不是SingleOrDefault()怎么样?》经验,为你挑选了2个好方法。

SingleOrDefault()方法很棒,因为如果您调用它的集合为空,它不会抛出异常.但是,有时我想要的是获取某种类型的新对象(如果不存在).例如,如果我能做到以下几点会很棒:

var client = db.Clients
    .Where(c => c.Name == "Some Client")
    .SingleOrNew();

这样我就不必检查它null是否是创建一个新的,我总是知道我的client对象将是我可以立即使用的东西.

有任何想法吗?



1> Noldorin..:

真的,你只想在这里使用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();
    }
}

我想说这可能是一般案例中最优雅的解决方案.



2> Eric King..:

如果你想要完成的只是覆盖默认值(并返回一个新对象),你可以在调用SingleOrDefault()之前使用DefaultIfEmpty()方法.就像是:

var client = db.Clients
    .Where(c => c.Name == name)
    .DefaultIfEmpty(new Client { Name = name })
    .SingleOrDefault();

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有