因为项目需要,接触到了LinQ,经过一段时间的学习,对LinQ有了简单的认识,本文就这个话题做个简单的叙述。
首先,应该写出几个问题,从宏观上了解一下。LinQ是什么?为什么使用LinQ?使用它有什么好处?
语言集成查询(Language Intergrated Query),是一组用于C#和vb语言的扩展,它允许编写C#或者vb代码以查询数据库相同的方式操作内存数据。----百度百科
通俗点说,它就是查询数据的。那么为什么要用它来查询数据呢,使用它有什么有点吗?
我们从稍微抽象一点的角度来考虑这个问题。面向对象的编程和数据访问的割裂:一 面向对象的语言和数据库有两套完全不相干的数据类型体系,编程语言中的string,在数据库中就是varchar,这完全没有统一性可言;二 SQL编码体验落后,我们编写SQL的语句,没有提示语句,只有写完了,才知道是否正确,客户体验度差;三 各类查询语言不一致,XML和数据库都有各自的数据查询体系,对象没有自己的查询体系。基于以上种种问题,LinQ出现了。
组成 上面也提到了,LinQ包括三类内容的查询,对象,XML文件和数据库。对数据库的查询分为三个部分:
Linq to sql,
linq to DataSet,
linq to Entities。
查询方式:LinQ查询数据有两种方式,语言查询和方法查询 。查询语句实用类似于SQL语句的形式查询,这种方式可读性强 ,但是限制较多,对于多条件查询很难实现。查询方法方式:这种方式可读性不强,但是可以实现很多复杂的查询要求,因为我们可以将查询条件单独做一个方法去实现。通常情况,为了代码的可读性,我们首先应该考虑使用查询语言方式,如果查询语言难以实现,应该将查询语言和查询方法结合起来混编使用,这样既最大化的实现了代码可读性,也增强了查询功能。
linq的几种高级查询方法:
聚合:Max,Min,Count,Sum等;
排序:ThenBy,OrderBy等;
分区:Take,Skip,TakeWhile,SkipWhile等;
集合:Distinct
生成:Range,Repeat
下面是几个LinQ查询示例:
1 基于语言、方法混编查询的方式(linq to objects):
<span style="font-size:18px;">private void btnQuery_Click(object sender, EventArgs e)
{
//LinQ To Object 基本方法部分
//泛型集合数据 person
List<String> person = new List<String>();
person.Add("老 大");
person.Add("老 二");
person.Add("老 三");
person.Add("老 四");
person.Add("老 五");
person.Add("小 六");
person.Add("小 七");
person.Add("小 八");
////输出person 所有元素
//var result = from p in person select p;
//输出person中所有以老开头的人
//语句、方法混编模式,使用语句查询,使用方法筛选
var result = (from p in person select p).Where(p => p.StartsWith("老"));
//打印
result.Print();
}
public static void Print(this IEnumerable<String> ie)
{
//获取可遍历的接口
IEnumerator<String> result = ie.GetEnumerator();
while (result.MoveNext())
{
Console.WriteLine("\n------------------------\n");
Console.WriteLine(result.Current);
Console.WriteLine("\n------------------------\n");
}
} </span>
这段代码首先定义了一个泛型集合对象person,然后使用查询语句和查询费昂发混编模式查询出以“老”开头的人,然后打印出来。查询语句不能完成所有的查询功能,需要借助查询方法来筛选,本例中的查询方法为系统提供。可以看出来,查询语句可读性强,但是功能不够强大,查询方法可读性不强,功能比较多。
<span style="font-size:18px;">2 基于查询方法模式(linq to objects)
private void btnSelect_Click(object sender, EventArgs e)
{
//LinQ To Object 基本方法部分
//泛型集合数据 person
List<String> person = new List<String>();
person.Add("老 大");
person.Add("老 二");
person.Add("老 三");
person.Add("老 四");
person.Add("老 五");
person.Add("小 六");
person.Add("小 七");
person.Add("小 八");
//方法四 调用外部复杂方法作为查询条件
var result = person.Where(p => Judge(p));
}
public bool Judge(String s)
{
if (s.StartsWith("老"))
{
return true;
}
else
{
return false;
}
} </span>
本段代码功能同上,完全使用查询方法完成了筛选功能,这个方法不同于上例中的方法,此方法是重新定义的方法。 <span style="font-size:18px;">3 基于数据库的查询(LinQ to Entities)
public ActionResult Index()
{
//1 使用linq语句获取实体数据
//查询条件中使用了lambda表达式
List<Models.BlogArticle> list = (from b in db.BlogArticle where b.AIsDel ==false select b).ToList ();
//2 使用viewdata获取数据
ViewData["DataList"] = list;
// 3 加载视图
list.Print();
}
public partial class BlogArticle
{
实体代码:略
}</span><span style="background-color: rgb(255, 255, 255);"> </span><span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;"> </span>
本例中,我们只是将数据对象替换成了实体集合,基本语法相同。
优点:书写简单,容易上手。以对象的形式查询数据,配合查询语句和查询方法的使用,是数据查询更加直观。
缺点:linq使用延迟加载功能,将待操作数据放入内存中,占用了大量资源,造成资源浪费。
原文地址:http://blog.csdn.net/u010942465/article/details/41773435