一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

asp.net linq用法与object用法

时间:2011-06-27 编辑:简简单单 来源:一聚教程网

:linq是什么? 

linq可以理解为嵌入C#语法的强类型查询语言。(注意:尽管linq看起来和Sql查询很像,但语法却不相同。)

二:linq的作用?
提供一种统一且对称的方式,让程序员得到数据和操作数据(此处的数据可以是XML,DataSet,物理数据等) 

查询数组

int[] arr = new int[] {5, 1, 9, 3, 4, 0, 8 };
var m = from item in arr
        select item;
foreach (var item in m)
{
    Response.Write(item.ToString() + "
");
}
结果:

5
1
9
3
4
0
8

可以看出 LINQ 和 SQL 很像,两点不同:

select 在后面,这可能是受某些限制,只好把 select 放在后面。
from 与数据之间多了个“变量名 in”。
查询 List

System.Collections.Generic.List arr = new System.Collections.Generic.List { 5, 1, 9, 3, 4, 0, 8 };
var m = from item in arr
        select item;
foreach (var item in m)
{
    Response.Write(item.ToString() + "
");
}

可以看出查询 List 与查询数组完全是一样的。另请参见 C# 3.0 -集合初始化设置。

查询

Dictionary

System.Collections.Generic.Dictionary arr = new System.Collections.Generic.Dictionary();
arr.Add(0, 5);
arr.Add(1, 1);
arr.Add(2, 9);
arr.Add(3, 3);
arr.Add(4, 4);
arr.Add(5, 0);
arr.Add(6, 8);
var m = from item in arr
        select item;
foreach (var item in m)
{
    Response.Write(item.Value.ToString() + "
");
}

我们可以发现在查询 Dictionary 时,查询语句是一样的,但输出时,不再是 item.ToString(),而是 item.Value.ToString(),并且我们在写完“item.”后,“Value”会自动出现 IntelliSense 中,不需要我们记忆。


返回时创建对象

string[] files = System.IO.Directory.GetFiles("C:");
var fis = from file in files
          select new System.IO.FileInfo(file);
foreach (var fi in fis)
{
    Response.Write(fi.Name + " " + fi.CreationTime.ToString() + "
");
}

上述先把 C: 下的文件放到 files 字符串数组中,然后在 LINQ 查询时,将其“包装”成 FileInfo 对象。注意这里使用了 var。

返回时创建匿名类型

int[] arr = new int[] { 5, 1, 9, 3, 4, 0, 8 };
var m = from item in arr
        select new { a = item, b = item + 1 };
foreach (var item in m)
{
    Response.Write(item.b.ToString() + "
");
}

使用 {},具体请参见 C# 3.0 -匿名类型。

使用 where、orderby

int[] arr = new int[] { 5, 1, 9, 3, 4, 0, 8 };
var m = from item in arr
        where item > 3
        orderby item descending
        select item;
foreach (var item in m)
{
    Response.Write(item.ToString() + "
");
}

注意 orderby 是连在一起的,而不是 order by;还有等于判断是“==”,而不是“=”。您可能会说 descending 多难写啊,不如 SQL 的 desc,其实不必担心,Visual Web Developer 和 Visual Studio 都有智能提示的。

 

三:linq可应用在哪些场景?
Linq to Object、Linq to XML、Linq to DataSet、Linq to Entities、Parallel Linq(并行处理linq查询返回的数据)

linq的基本语法:var result = from item in container select item; 

linq获取数据子集: var result = from item in container where booleanexpression select item;

linq to object 例子

        static void QueryStrings()
        {
            string[] games = { "Morrowind", "Uncharted 2", "Fallout 3", "Daxter", "Shock2" };
            //构建一个查询表达式(注意:ling表达式在迭代内容之前,他们不会真正的运行计算)//linq此时还没有运算
            //linq查询的结果集,应该总是使用隐式类型,在绝大数情况下,真正的返回值实现了泛型 IEnumerable接口的类型
            var subset = from g in games where g.Contains(" ") orderby g select g;
            //上面代码也可以写成 IEnumerable subset = from g in games where g.Contains(" ") orderby g select g;
            //输出结果。在迭代的时候才运算(这叫:延迟执行)
            foreach (string s in subset)
            {
                Console.WriteLine("含有空格的是:{0}",s);
            }
        }

 

 


linq在迭代外运算例子:

       //在foreach逻辑外运算linq
        static void QueryInt()
        {
            //如果希望在foreach逻辑外表运算Linq表达式,可以调用有Enumerable类型定义的扩展方法。如ToArray()、ToList()等。
            int[] numbers = { 2, 10, 30, 15, 1, 22 };
            //立即获取数据
            int[] rst =( from i in numbers where i >10 orderby i select i).ToArray();

        }

 

 


linq查询中的常用函数
1.count() 获取linq查询表达式返回的项数

        static void FunLinq()
        {
            int[] numbers = { 2, 10, 30, 15, 1, 22 };
            //输出大于10的总数
            int count = (from i in numbers where i > 10 orderby i select i).Count();
            Console.WriteLine(count);//输出:3
        }

 

 


2.Reverse对linq结果集中的项进行反转

      var newnumbers = from i in numbers select i;
            foreach (var p in numbers.Reverse())
            {
                Console.WriteLine(p);//输出22 1 15 30 10 2
            }

 

 


3.orderby 对linq进行排序,默认是正序

       //排序(正序)
            string[] games = { "Morrowind", "Uncharted 2", "Fallout 3", "Daxter", "Shock2" };
            var newn = from i in games orderby i ascending select i;
            foreach (var p in games)
            {
                Console.Write(p+",");//
            }

 


4.Distinct()移除数据中的重复项目    //排序(正序)

            string[] games = { "Morrowind", "Uncharted 2", "Fallout 3", "Daxter", "Shock2", "Shock2"};
            var newn = from i in games orderby i ascending select i;
            foreach (var p in games.Disinct())
            {
                Console.Write(p+",");//
            }

 


5.聚合操作

 

//聚合操作


            //最大值
            var maxi =( from i in games orderby i ascending select i).Max();
            //最小值
            var mini = (from i in games orderby i ascending select i).Min();
            //平均值
            var avar = (from i in numbers orderby i ascending select i).Average();
            //总和
            var sum = (from i in numbers orderby i ascending select i).Sum();

热门栏目