0

0

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

php中文网

php中文网

发布时间:2016-06-07 16:11:04

|

2606人浏览过

|

来源于php中文网

原创

因为项目需要,接触到了LinQ,经过一段时间的学习,对LinQ有了简单的认识,本文就这个话题做个简单的叙述。 首先,应该写出几个问题,从宏观上了解一下。LinQ是什么?为什么使用LinQ?使用它有什么好处? 语言集成查询(Language Intergrated Query),是一

因为项目需要,接触到了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。

\

喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICCy6dGvt73KvaO6TGluUbLp0a/K/b7d09DBvdbWt73KvaOs0+/R1LLp0a+6zbe9t6iy6dGvCqGjsunRr9PvvuTKtdPDwOAmIzIwMjg0O9PaU1FM0+++5LXE0M7KvbLp0a+jrNXi1ta3vcq9v8m2wdDUx78Ko6y1q8rHz97Wxr3PtuCjrLbU09q24Mz1vP6y6dGvutzE0cq1z9aho7Lp0a+3vbeot73KvaO61eLW1re9yr2/ybbB0NSyu8e/o6y1q8rHv8nS1Mq1z9a63LbguLTU07XEsunRr9Kqx/OjrNLyzqrO0sPHv8nS1L2rsunRr8z1vP61pbbA1/bSu7j2t723qMilyrXP1qGjzaizo8fpv/ajrM6qwcu0+sLrtcS/ybbB0NSjrM7Sw8fK18/I06a4w7+8wsfKudPDsunRr9Pv0dS3vcq9o6zI57n7sunRr9Pv0dTE0dLUyrXP1qOs06a4w72rsunRr9Pv0dS6zbLp0a+3vbeoveG6z8bwwLS77LHgyrnTw6Os1eLR+bzI1+6087uvtcTKtc/Wwcu0+sLrv8m2wdDUo6zSstT2x7/By7Lp0a+5psTcoaM8L3A+CjxwPiBsaW5xtcS8uNbWuN+8trLp0a+3vbeoo7o8L3A+CjxwPr7bus+juk1heCxNaW4sQ291bnQsU3VttcijuzwvcD4KPHA+xcXQ8qO6VGhlbkJ5LE9yZGVyQnm1yKO7PC9wPgo8cD631sf4o7pUYWtlLFNraXAsVGFrZVdoaWxlLFNraXBXaGlsZbXIo7s8L3A+CjxwPryvus+jukRpc3RpbmN0PC9wPgo8cD7J+rPJo7pSYW5nZSxSZXBlYXQ8L3A+CjxwIGxhbmc9"en-US">

下面是几个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>

成新网络商城购物系统
成新网络商城购物系统

使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888

下载

本例中,我们只是将数据对象替换成了实体集合,基本语法相同。

优点:书写简单,容易上手。以对象的形式查询数据,配合查询语句和查询方法的使用,是数据查询更加直观。

缺点:linq使用延迟加载功能,将待操作数据放入内存中,占用了大量资源,造成资源浪费。


热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

5

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

12

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

33

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

25

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

77

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

60

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

48

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

26

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

20

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 12.6万人学习

CSS3 教程
CSS3 教程

共18课时 | 6.5万人学习

Git 教程
Git 教程

共21课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号