使用LinQ实现对数据对象的查询

因为项目需要,接触到了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使用延迟加载功能,将待操作数据放入内存中,占用了大量资源,造成资源浪费。

时间: 2024-10-19 22:48:33

使用LinQ实现对数据对象的查询的相关文章

linq根据传入数据集合查询对应子级数据

工作中经常用到的linq根据传入数据集合查询对应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点对应ID数据集合,再根据ID数据集合查询全部子级数据. //获取缓存数据 object obj = Caching.GetCache(CacheKey + UModel.RoleId); if (obj != null)//判读缓存数据是否null { SysFunList = (DataSet)obj; } else { string strSql = "select

在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型XXX的对象时检测到循环引用。

在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型 的对象时检测到循环引用. 异常信息(部分): System.Web.Services.Protocols.SoapException: 服务器无法处理请求. ---> System.InvalidOperationException: 生成 XML 文档时出错. ---> System.InvalidOperationException: 序列化类型 Web

Spring Jdbc 自定义 ORM——sql查询对应Java数据对象

Target:  实现如下,通过Spring Jdbc,传入sql,查询满足条件的Java数据对象: pojo: public class ZmTest { public ZmTest() { // TODO Auto-generated constructor stub } private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) {

linq依据传入数据集合查询相应子级数据

工作中经经常使用到的linq依据传入数据集合查询相应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点相应ID数据集合,再依据ID数据集合查询所有子级数据. //获取缓存数据 object obj = Caching.GetCache(CacheKey + UModel.RoleId); if (obj != null)//判读缓存数据是否null { SysFunList = (DataSet)obj; } else { string strSql = "sele

MVC——mvc+linq+EF对数据表的查删改

上篇博客中简单的介绍了MVC的组成以及各部分的作用.这篇博客将介绍MVC+linq+EF框架实现对数据表的查询.删除.修改. 先说一下什么是Linq? linq是基于关系数据的.net语言集成查询,用于对象形式管理关系数据.在本篇博客的实例中主要使用linq进行查询数据. 再说一下什么是EF? 说到EF不得不先说一下ORM,ORM全称:(Object-Relation  Mapping)即对象-关系映射.ORM是将关系数据库中的业务数据用对象的形式表现出来,并通过面向对象的方式将这些对象组织起来

LINQ处理List数据

Linq处理List数据 2011-01-28 19:53:00|  分类: 默认分类|举报|字号 订阅 概述:LINQ又称为语言集成查询,是一种类似于SQL的一种查询语言.语言集成查询让开发人员可以使用.NET程序语言(如C#)去查询数据源,主要数据源为内存中的集合对象.ADO.NET数据集.数据库以及XML,开发人员不用去分门别类地学习众多的查询语法就可以轻松地查询异构数据源. 三种表现形式:复合查询.Lambda表达式以及混合查询. 1.查询集合数据方法依次为: var result=fr

C# Linq处理list数据

阅读目录 1.GroupBy与group by 2.Where条件筛选. 3.Select(取list中的id列数据,并按逗号分隔成字符串.例:1,2,3,4,5) 4.Where与Select的同时使用,取list中的id列数据,并按逗号分隔成字符串. 5.左联与内联(例子是DataTable类型) 6.OrderBy排序 7.OrderBy随机排序 8.Skip,Take分页(LINQ:使用Take和Skip实现分页) 9.Distinct去重 获取数据列表. //获取数据列表,Model是

PHP面向对象之php数据对象(PDO)——图书查看管理

首先创建相关的有关的数据库:数据库的名字我用的是books表名用的是book(下面是完整的数据库,里面的img/img01.jpg是显示的图片的路径) CREATE DATABASE books DEFAULT CHARSET=utf8;USE books; CREATE TABLE book( b_id INT PRIMARY KEY AUTO_INCREMENT, b_name VARCHAR(100) NOT NULL UNIQUE, b_img VARCHAR(50) NOT NULL,

Oracle事务和常用数据对象

防伪码:一寸光阴一寸金 前言:本次内容的相关知识点我们在学习sqlserver2008R2的时候介绍过一些,包括:事务.索引.视图等.那么今天我们学习在oracle上实现这些重要的内容,以实现数据库的优化. 一.事务 1.简介 事务是数据处理的核心,是业务上的一个逻辑单元,它能够保证其中对数据所有的操作,要么全部成功,要么全部失败.DBMS通过事务的管理来协调用户的并发行为,减少用户访问资源的冲突. 1)显示提交:当事务遇到COMMIT指令时,将结束事务并永久保存所有的更改的数据. 2)显示回滚