首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

linq查询创办策略及数据转换-学习linq的资料和笔记(六)

2012-12-31 
linq查询创建策略及数据转换--学习linq的资料和笔记(六)创建复杂linq查询的创建策略其实跟子查询有些相,就

linq查询创建策略及数据转换--学习linq的资料和笔记(六)

创建复杂linq查询的创建策略其实跟子查询有些相似,就是在查询的过程中对数据进行进一步的处理,资料中介绍了三种创建策略如下(以下内容来自博客园)

 渐进式创建查询

渐进式创建查询就是通过链接查询运算符的方式来创建LINQ查询。因为每一个查询运算符返回一个装饰者sequence,所以我们可以在其之上继续调用其它查询运算符。使用这种方式有如下几个优点:

  • 使得查询易于编写
  • 我们可以根据条件来决定是否调用某个查询运算符,如:if (includeFilter) query = query.Where(…)

    渐进的方式通常是对查询的创建有益的,考虑如下的例子:我们需要在名字列表中去除所有名字的元音字母,然后对长度大于2的名字进行排序。在方法语法中,我们可以在一个表达式中完成这个查询:

    linq查询创办策略及数据转换-学习linq的资料和笔记(六)
                IEnumerable<string> query =
    from n in names
    select n.Replace("a", "").Replace("e", "").Replace("i", "")
    .Replace("o", "").Replace("u", "");

    query = from n in query
    where n.Length > 2
    orderby n
    select n; // Result: Dck, Hrry, Mry
    linq查询创办策略及数据转换-学习linq的资料和笔记(六)into关键字

    在我们前面查询表达式的例子中,select关键字的出现也就意味着查询的结束了。而into关键字让我们在结果投影之后还可以继续我们的查询,它是对分步构建查询表达式的一种简写方式。现在我们可以使用into关键字来重写上例中的查询:

    linq查询创办策略及数据转换-学习linq的资料和笔记(六)
                IEnumerable<string> query =
    from n in names
    select n.Replace("a", "").Replace("e", "").Replace("i", "")
    .Replace("o", "").Replace("u", "")
    into noVowel
    where noVowel.Length > 2
    orderby noVowel
    select noVowel; // Result: Dck, Hrry, Mry
    linq查询创办策略及数据转换-学习linq的资料和笔记(六)

    我们只能在select和group子句后面使用into关键字,它会重新开始一个查询,让我们可以继续引入where, orderby和select子句。尽管表面上看,我们重新创建了一个新的查询,但当上面的查询被翻译成方法语法时,它只是一个查询,一个链接了多个运算符的查询,所以上面的写法不会造成性能问题。

    需要注意的是,所有的查询变量在into关键字之后都不再可见,下面的例子就说明了这一点:

    linq查询创办策略及数据转换-学习linq的资料和笔记(六)

    linq查询创办策略及数据转换-学习linq的资料和笔记(六)

            class TempProjectionItem
    {
    public string Original;
    public string Vowelless;
    }

    static void TestProjectionStrategy()
    {
    string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };

    IEnumerable<TempProjectionItem> temp =
    from n in names
    select new TempProjectionItem
    {
    Original = n,
    Vowelless = Regex.Replace(n, "[aeiou]", "")
    };
    //我们可以继续在结果中查询
    IEnumerable<string> query =
    from item in temp
    where item.Vowelless.Length > 2 //按去除元音字母版本过滤
    select item.Original; //结果为姓名原始版本
    }
    linq查询创办策略及数据转换-学习linq的资料和笔记(六)匿名类型

    上面我们自己定义了类型TempProjectionItem来存放查询的结果。通过使用匿名类型,我们可以省去这种中间类型的定义,而由编译器来帮我们完成:

    linq查询创办策略及数据转换-学习linq的资料和笔记(六)
                var intermediate = from n in names
    select new
    {
    Original = n,
    Vowelless = Regex.Replace(n, "[aeiou]", "")
    };
    IEnumerable<string> query = from item in intermediate
    where item.Vowelless.Length > 2
    select item.Original;
    linq查询创办策略及数据转换-学习linq的资料和笔记(六)

    需要注意的是,因为匿名类型的确切类型名是由编译器自动产生的,因此intermediate的类型为:IEnumerable <random-compiler-produced-name> 。我们来声明这种类型的唯一方式就是使用var关键字,这时,var不只是更加简洁,而且也是必需的手段。

    let关键字

    let关键字让我们可以在保持范围变量的同时引入新的查询变量。比如上面的示例,我们可以用let关键字作如下改写:

                string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };
    var query = from n in names
    let Vowelless = Regex.Replace(n, "[aeiou]", "")
    where Vowelless.Length > 2
    select n; //正是因为使用了let,此时n仍然可见

    let关键字非常灵活和方便,就像例子看到的那样。而且,我们可以使用多个let关键字,并且后面的 let表达式可以引用前一个let关键字引入的变量。

     

     

     

     

     

    1楼oKanPaSi昨天 15:28
    想问博主一个问题:用linq和直接用sql查询,速度方面有优势吗?
    Re: zhouqinghe24昨天 16:16
    回复oKanPaSinlinq to sql 最终是把linq的方法解释为sql语句来查询数据库。在这一点效率上并没有区别。但是linq有一个特性就是延迟执行,也叫懒人模式,就是在使用数据时才会连接数据库查询数据,而不是在执行方法的时候查询 。

  • 热点排行