zoukankan      html  css  js  c++  java
  • EF中使用Linq时First、FirstOrDefault、Single、SingleOrDefault几个方法的区别

    一、前言

        在使用EntityFramework开发时,.NET的System.Linq.Enumerable类为我们提供了许多Linq方法。

        给大家分享一下关于First、FirstOrDefault、Single、SingleOrDefault几个方法的区别实例及使用场景,首先是关于这几个方法的定义:

        ● First:返回序列中的第一条记录,如果没有记录,则引发异常。

        ● FirstOrDefault:返回序列中的第一条记录,如果没有记录,则返回默认值。

        ● Single:返回序列中的唯一记录,如果没有或返回多条记录,则引发异常。

        ● SingleOrDefault:返回序列中的唯一记录;如果该序列为空,则返回默认值;如果该序列包含多个元素,则引发异常。

    二、实例和用法

    1、First与FirstOrDefault

        ◆ First返回序列中的第一条记录,如果没有记录,则引发异常,示例代码如下:

    static void Main(string[] args)
    {
           string[] strName = { "Fred", "Gary", "William", "Charles" };
           string[] strNameEmpty = { };
           try
           {
               string tempName = strName.First();
               Console.WriteLine("First()第一种 返回序列中的第一条记录。");
               Console.WriteLine("信息为:{0}", tempName);
    
               //如果序列中没有元素则会发生,InvalidOperationException 异常。 源序列为空。
               string tempNameEmpty = strNameEmpty.First();
           }
           catch (Exception ex)
           {
               Console.WriteLine("First()第二种 返回序列中没有元素,引发异常。");
               Console.WriteLine("信息为:{0}", ex.Message);
           }
    }

        结果如下图所示:

        ◆ FirstOrDefault返回序列中的第一条记录,如果序列中不包含任何记录,则返回默认值对于可以为null的对象,默认值为null,对于不能为null的对象,如int,默认值为0),示例代码如下:

    static void Main(string[] args)
    {
           string[] strName = { "Fred", "Fred", "William", "Charles" };
           string[] strNameEmpty = { };// string 类型的默认值是空
           string tempName = strName.FirstOrDefault();
           Console.WriteLine("FirstOrDefault()第一种 返回序列中的第一条记录。");
           Console.WriteLine("信息为:{0}", tempName);
    
           string tempNameEmpty = strNameEmpty.FirstOrDefault();
           Console.WriteLine("FirstOrDefault()第二种 如果序列中不包含任何记录,则返回默认值。");
           Console.WriteLine("信息为:{0}", tempNameEmpty);
    }

        结果如下图所示:

    2、Single与SingleOrDefault

        ◆ Single返回序列中的唯一一条记录,如果没有或返回多条,则引发异常,示例代码如下:

    static void Main(string[] args)
    {
             string[] strName = { "Fred"};
             string[] strNameEmpty = { };
             try
             {
                 string tempName = strName.Single();
                 Console.WriteLine("Single()第一种 返回序列中的唯一一条记录。");
                 Console.WriteLine("信息为:{0}", tempName);
    
                 //没有或返回多条,则引发异常。 string[] strNameEmpty = { "Fred","Crazy"};
                 string tempNameEmpty = strNameEmpty.Single();
             }
             catch (Exception ex)
             {
                 Console.WriteLine("Single()第二种 没有或返回多条,则引发异常。");
                 Console.WriteLine("信息为:{0}", ex.Message);
             }
    }

        结果如下图所示:

        ◆ SingleOrDefault返回序列中满足指定条件的唯一元素;如果这类元素不存在,则返回默认值;如果有多个元素满足该条件,此方法将引发异常,示例代码如下:

    static void Main(string[] args)
    {
             string[] strName = { "Fred"};
             string[] strNameEmpty = { };
             string[] strEmpty = { "Fred", "Crazy" };
             try
             {
                 string tempName = strName.SingleOrDefault();
                 Console.WriteLine("SingleOrDefault()第一种 返回序列中的唯一记录。");
                 Console.WriteLine("信息为:{0}", tempName);
    
                 string tempNameEmpty = strNameEmpty.SingleOrDefault();
                 Console.WriteLine("SingleOrDefault()第二种 如果该序列为空,则返回默认值。");
                 Console.WriteLine("信息为:{0}", tempNameEmpty);
    
                 //序列包含多个元素,则引发异常 string[] strNameEmpty = { "Fred","Crazy"};
                 string tempEmpty = strEmpty.SingleOrDefault();
             }
             catch (Exception ex)
             {
                 Console.WriteLine("SingleOrDefault()第三种 如果该序列包含多个元素,则引发异常。");
                 Console.WriteLine("信息为:{0}", ex.Message);
             }
    }

        结果如下图所示:

    三、什么时候用First、FristOrDefault、Single、SingleOrDefault?

        1、当集合中只有一个元素时,可以使用Single

        2、当集合中不包含任何元素但需要返回默认值时,可以使用SingleOrDefault。

        3、当集合中包含多个元素想抛出异常时,可以使用SingleSingleOrDefault。

        4、无论集合中是否有元素,我们都想要返回一个记录时,可以使用FirstFirstOrDefault。

        5、当集合中不包含任何元素但需要返回默认值时,可以使用FirstOrDefault。

    四、总结

        FirstSingle的区别:前者是TOP(1)后者是TOP(2),后者如果查询到两条数据则抛出异常。所以在必要的时候使用Single也不会比First慢多少。

        FirstOrDefaultSingleOrDefault的性能比较:

        FirstOrDefault通常在性能上会比SingleOrDefault表现得比优,因为FirstOrDefault是从集合开始位置查找到第一个匹配的元素就返回,而SingleOrDefault会迭代集合中所有的元素。

        助记:有OrDefault的方法会返回值(如果没有符合条件的元素,则返回默认值),没有OrDefault的方法会抛出异常。

    方法名

     

     

     

    First()

    一条记录

      返回没有,则异常

     

    FirstOrDefault()

    一条记录

      返回没有,默认值

     

    Single()

    一个记录

      返回没有,则异常

    多条异常

    SingleOrDefault()

    一个记录

      返回没有,默认值

    多条异常

     

    优秀是一种习惯,欢迎大家关注学习 

  • 相关阅读:
    试题 历届试题 国王的烦恼
    试题 历届试题 九宫重排
    试题 历届试题 网络寻路
    试题 历届试题 危险系数
    试题 历届试题 横向打印二叉树
    试题 历届试题 幸运数
    试题 历届试题 大臣的旅费
    试题 历届试题 连号区间数
    Linux多进行之fork
    linux C语言getopt()函数的使用
  • 原文地址:https://www.cnblogs.com/1312mn/p/9212325.html
Copyright © 2011-2022 走看看