当前位置:首 页 > 攻城湿 >.Net & C# > 查看文章

C#中Linq查询基本操作

.Net & C# 你是第2449个围观者 7条评论 供稿者: 标签:,

– from 子句

– where 子句

– select子句

– group 子句

– into 子句

– orderby 子句

– join 子句

– let 子句

复合from子句

– 在某些情况下,源序列中的每个元素本身可能是序列(集合),也可能包含序列

– 用语访问单个数据库中的内部集合

– 使用多个from字句执行连接

– 可以包含多个可从独立数据源生成补充查询的from字句

复合(顾名思义就是有多from的字句)实例:

class Program
{
    static void Main(string[] args)
    {
        List<student> students = new List</student><student>         
        {            
            new Student 
            {
                LastName="xiaogui",Scores=new List<int>{97,42,91,60}},
                new Student
                {
                    LastName="xiaozhan",Scores=new List</int><int>{50,92,81,60}},   
                    new Student 
                    {
                        LastName="xiaolan",Scores=new List</int><int>{32,32,81,90}},
                        new Student 
                        {
                            LastName="xiaowan",Scores=new List</int><int>{92,22,81,60}},         
        };
        var query = from stuent in students
                    from score in stuent.Scores
                    where score > 90
                    select new
                    {
                        Last = stuent.LastName,
                        score
                    };
        foreach (var student in query)//大于90分的显示出来        
        {
            Console.WriteLine("{0} Score:{1}", student.Last, student.score);
        }
        Console.ReadLine();
    }
}
</int></student>
public class Student 
{ 
    public string LastName { get; set; } 
    public List<int> Scores { get; set; }
}
public class Employee
{
    public string First { get; set; }
    public string Last { get; set; }
    public int ID { get; set; }
}
</int>

执行结果: xiaogui Score:97

xiaogui Score:91

xiaozhan Score:92

xiaowan Score:92

let 关键字(使用let字句扩展范围变量)

– 创建一个可以查询自身的可枚举类型

– 使查询只能对范围变量word调用一次ToLower。

如果不使用let,则必须在where字句的每个谓词中调用ToLower

例:把每个单词开头包含a或者e的找出来

using System;
using System.Linq;

public class Test
{
    static void Main(string[] args)
    {
        string[] strings = { "A penny saved is a penny earned.", "The aaxly sdj", "the pa is no" };

        var query = from sentence in strings
                    let words = sentence.Split(' ')//用空格分割成数组                
                    from word in words
                    let w = word.ToLower()//把每个字母小写        
                    where w[0] == 'a' || w[0] == 'e'
                    select word;

        foreach (var s in query)
        {
            Console.WriteLine(s);
        }
        Console.ReadLine();
    }
}

where 关键字 (筛选)

– 一个查询表达式可以包含多个where字句

例:(把包含a的找出来)

using System;
using System.Linq;

public class Test
{
    static void Main(string[] args)
    {
        string[] str = { "a", "b", "c" };

        var query = from s in str
                    where s == "a"
                    select s;

        foreach (var s in query)
        {
            Console.WriteLine(s);
        }
        Console.ReadLine();
    }
}

orderby 关键字 (排序)

– 在查询表达式中,orderby字句可以使返回的序列(组)按升序或降序。

– 可以指定多个键,以便执行一个或多个次要排序操作

– 默认排序顺序为升序

– 编译时,orderby字句被转换为对OrderBy方法的调用。orderby字句中的多个键被转换为ThenBy方法调用

descending 降序

ascending 升序

例1:升序

using System;
using System.Linq;

public class Test
{
    static void Main(string[] args)
    {
        string[] str = { "a", "b", "c" };
        var query = from s in str
                    orderby s ascending
                    select s;
    }
}

结果为: a b c

例2:降序

using System;
using System.Linq;

public class Test
{
    static void Main(string[] args)
    {
        string[] str = { "a", "b", "c" }; 
        var query = from s in str 
                    orderby s descending 
                    select s;
    }
}

结果为: c b a

group 关键字 (分组)

– group 字句返回一个IGrouping(TKey,Telement)对象序列

– 编译时,group子句被转换为对GroupBy方法的调用

(LINQ查询表达式可以以select或者Group结束) (如果想要对每个组执行附加查询操作,则可以使用into上下文关键字指定一个临时标识符,使用into时,必须继续编写该查询,并最终用一个select语句或另一 个group子句结束该查询)

例:

using System;
using System.Linq;

public class Test
{
    static void Main(string[] args)
    {
        string[] str = { "aa", "bb", "cc", "dd" };
        var query = from s in str
                    group s by s[0]
                        into p
                        where p.Key == 'a' || p.Key == 'b' || p.Key == 'c'
                        orderby p.Key descending
                        select p.Key;

        foreach (var s in query)
        {
            Console.WriteLine(s);
        }
        Console.ReadLine();
    }
}

结果为: c b a

说明: group s by s[0] into p 意思是针对范围变量s用“s[0]”分组,本例中是用第一个字母分组

join 关键字 (联接)

– 使用join 子句可以将来自不同源序列并且在对象模型中没有直接关系的元素相关联

– 唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值

– join字句使用特殊的equals关键字比较指定的键是否相等

三中常见的连接类型

– 内部联接

– 分组联接

– 左外部联接

1.内部联接

   var query = from a
                        in str
                    join b in str2 on a.id equals b.id
                    select new { Aname = a.name, Bname = b.name };

2.分组联接:(into 可以将join暂存起来)

var query =  from a in str 
                  join b in str2 on a.id equals b.id 
                  into c
                  select new {Aname=a.name,Cs=c}

3.左外部联接

– 在左外部联接中,将返回左则源序列中所有元素,即使它们在右则序列中没有匹配的元素也是如此。

– 若要在LINQ中执行左外部联接,请将DefaultifEmpty方法与分组联接结合起来,以指定要在某个左则元素不具有匹配元素时产生的默认右则元素。可以使用null作为任何引

用类型的默认值,也可以指定用户定义的默认类型。

 var query =  from category 
                  in categories 
              join prod in products on category.id equals prod.CategoryID 
              into prodGroup 
              from item prodGroup.defaultifEmpty(
                  new Product{Name=string.empty,CategoryID=0}) 
        select new {CatName=category.Name,ProdName=item.Name}

equalse 运算符

– join 子句执行同等联接。换句话说,只能基于两个键之间的相等关系进行匹配

– 为了表明所有联接都是相等联接,join子句使用equals关键字而不是==运算符

复合键

– 使用复合键可以测试多个值是否相等

select 关键字 选择

这家伙很懒,什么都没写!

—— zhaorong

zhaorong
你可能也喜欢Related Posts
众说纷纭Comments
大眼 可爱 大笑 坏笑 害羞 发怒 折磨 快哭了 大哭 白眼 晕 流汗 困 腼腆 惊讶 憨笑 色 得意 骷髅 囧 睡觉 眨眼 亲亲 疑问 闭嘴 难过 淡定 抗议 鄙视 猪头
小提示:直接粘贴图片到输入框试试
努力发送中...
  1. 1 楼 访客

    捧腹网是中国领先的笑话幽默分享网站,捧腹致力于打造一个分享各类欢乐内容的互动平台,让我们一起: “捧腹开怀、乐享人生”!干过的顶

    2014年01月17日 06:33:08 回复 取消回复
  2. 2 楼

    光棍一回头,此地空余黄鹤楼;光棍二回头,几家欢乐几家愁;光棍三回头,借问酒家何处有;光棍四回头,牛郎织女闹分手;光棍五回头,刘翔改打乒乓球;光棍六回头,一江春水倒起流

    2014年01月18日 11:28:24 回复 取消回复
  3. 3 楼

    不是在一起才会有浪漫,爱情短信不管有多远,我的浪漫无处不在。牛郎对织女说,尽管只能七夕见,只要有手机,我天天都在你身边。亲爱的,七夕节快乐。
    http://www.jgjjs.com/company/index.html http://www.jgjjs.com/company/index.html

    2014年01月20日 05:19:44 回复 取消回复
  4. 4 楼

    最明的,莫过于一年一度芳草绿,莫过于倾听年轮的呼吸.每逢这种时刻,便簇拥着我们共同的梦境,你我总在梦中嫣然笑语新年快乐!

    2014年01月21日 09:05:58 回复 取消回复
  5. 5 楼 访客

    或许岁月将往事退色,或许距离将彼此隔离,但我们的友谊将点燃我对你的思念,在此深深的对你说声圣诞快乐!

    2014年01月22日 07:38:23 回复 取消回复
  6. 6 楼

    捧腹网是中国领先的笑话幽默分享网站,捧腹致力于打造一个分享各类欢乐内容的互动平台,让我们一起: “捧腹开怀、乐享人生”!红领巾

    2014年02月10日 08:59:42 回复 取消回复
  7. 7 楼 访客

    马嘞个壁,割了那个虚荣女,,,lz女家里经营一家小理发店二三十平方米,刚才有个头油乎乎的女的要进来估计是洗头,走到店门了看了一眼,就对她同伴说,找个大店去洗去,我草泥马!过一会儿她们又进来了,问洗头多少钱,我就不给她洗了,我直接说洗头二十块!(原价洗头十块钱)那虚荣女嫌贵走了,真她妈痛快,叫你他妈看不起我们小店,我们小店也是有尊严的!漂漂的婶婶给过吧,我经常按赞的~30以下就不要小纸条了

    2014年03月17日 03:46:05 回复 取消回复
  • 评论最多
  • 最新评论
  • 随机文章
footer logo
未经许可请勿自行使用、转载、修改、复制、发行、出售、发表或以其它方式利用本网站之内容
Copyright © zhaorong All Rights Reserved. 滇ICP备15006105号-1