EF – 2.EF数据查询基础(上)查询数据的实用编程技巧

目录

5.4.1 查询符合条件的单条记录

EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录。

5.4.2 Entity Framework中的内部数据缓存

DbSet.Local属性所引用的数据集合,缓存了从数据库中提取的数据,同时包容了用户对这些数据所做的修改。本讲视频介绍了访问这一数据缓存的基本编程技巧和注意事项。并且对如何提升数据库应用程序的性能提了一些建议:使用MemCache等第三方缓存系统,直接发送SQL命令到数据库,或者使用ADO.NET绕开EF直接访问数据库。

5.4.3 再谈异步查询

介绍一些使用Entity Framework查询数据的实用编程技巧。

 

5.4.1 《查询符合条件的单条记录》  时长:8分40秒 难度:易

EF使用SingleOrDefault()Find()两个方法查询符合条件的单条记录。

                var client = (from c in context.UPMS_User
                              where c.UserId == 1
                              select c).SingleOrDefault();

 

//Find方法会先在内存中找,找不到之后再到数据库提取
//注意:Find方法的参数是主键字段的某个值
var client = context.UPMS_User.Find(2);

 

image

 

5.4.2 《Entity Framework中的内部数据缓存》  时长:11分12秒 难度:中

DbSet.Local属性所引用的数据集合,缓存了从数据库中提取的数据,同时包容了用户对这些数据所做的修改。本讲视频介绍了访问这一数据缓存的基本编程技巧和注意事项。并且对如何提升数据库应用程序的性能提了一些建议:使用MemCache等第三方缓存系统,直接发送SQL命令到数据库,或者使用ADO.NET绕开EF直接访问数据库。

1.查询数据

image

2. 执行Local

复制代码
        static void UseLocalCache()
        {
            using (UPMSEntities dbc = new UPMSEntities())
            {
                var lq = from d in dbc.UPMS_User.Where(p => p.UserId < 10)
                         select d;

                foreach (var item in lq)
                {
                    Console.WriteLine(item.UserId + "," + item.RealName);
                }
                //访问Local绝对不会向服务器发送SQL
                Console.WriteLine("共有{0}条记录\n\r",dbc.UPMS_User.Local.Count());
            }
        }
复制代码

 

3.完整的代码示例

复制代码
 1         static void UseLocalCache()
 2         {
 3             using (UPMSEntities dbc = new UPMSEntities())
 4             {
 5                 var lq = from d in dbc.UPMS_User.Where(p => p.UserId < 10)
 6                          select d;
 7 
 8                 foreach (var item in lq)
 9                 {
10                     Console.WriteLine(item.UserId + "," + item.RealName);
11                 }
12                 //访问Local绝对不会向服务器发送SQL
13                 Console.WriteLine("共有{0}条记录\n\r",dbc.UPMS_User.Local.Count());
14 
15                 //针对本地数据的查询,不会访问数据库
16                 var c = dbc.UPMS_User.Local.FirstOrDefault(p => p.UserId == 9);
17                 Console.WriteLine("\n在本地查找UserId == 9的记录,可找到");
18                 ShowIn(c);
19 
20                 c = dbc.UPMS_User.Local.FirstOrDefault(p => p.UserId == 11);
21                 Console.WriteLine("\n在本地查找UserId == 11的记录,找不到");
22                 ShowIn(c);
23 
24                 UPMS_User newuser = new UPMS_User(){
25                      UserId = 11,
26                       RealName="aaaaaa"
27                 };
28 
29                 dbc.UPMS_User.Add(newuser);
30                 //现在再找就找到了,但数据库中的记录不是这样的
31                 c = dbc.UPMS_User.Local.FirstOrDefault(p => p.UserId == 11);
32                 Console.WriteLine("\n本地缓存中的数据为:");
33                 ShowIn(c);
34                 Console.WriteLine("\n数据中原始数据为:");
35 
36                 c = dbc.UPMS_User.SingleOrDefault(p => p.UserId == 11);
37                 ShowIn(c);
38             }
39         }
40 
41         static void ShowIn(UPMS_User user)
42         {
43            if (user==null)
44            {
45                Console.WriteLine("User为Null");
46            }
47            else
48            {
49                Console.WriteLine("Userid为:{0},RealName为:{1}...", user.UserId, user.RealName);
50            }
51            
52         }
复制代码

image

 

 

image

 

                context.Database
                    .ExecuteSqlCommand("delete from Client where ClientID={0}", ClientID);

这种方法不能滥用。免得与底层数据绑定得过于紧密。

如果比较复杂,建议直接使用ADO.NET。

 

5.4.3 《再谈异步查询》  时长:3分50秒 难度:易

EF6以上可以使用异步方法,介绍更多的异步查询知识,以帮助大家在实际开发中用好异步查询。

附件中包容本讲源代码及示例数据库MyDb(SQL Server 2012格式,请自行使用SQL Server Management Studio(SSME)附加,注意附加前在资源管理器中为mdf和ldf为“Authenticated User”设置"完全控制“权限,否则,SSME会附加失败)。此示例数据库在后面被一直使用

static async System.Threading.Tasks.Task ShowClientAsync()
        {
            using (var context =new UPMSEntities())
            {
                Console.WriteLine("ShowClientAsync():正在提取数据中,,,");
                var query = from client in context.UPMS_User
                            select client;
                var clients = await query.ToListAsync();

                Console.WriteLine("\n数据提取完毕,显示如下:");
                foreach (var item in clients)
                {
                    Console.WriteLine("{0},{1}",item.UserId,item.RealName);
                }
                Console.WriteLine("\n数据显示完毕,共育{0}条数据:",clients.Count());
            }
        }

作者:【唐】三三

出处:https://www.cnblogs.com/tangge/p/4517247.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   【唐】三三  阅读(1099)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2014-05-20 MVC – 8.Razor 布局
2012-05-20 js改变Lable的innerText后,怎样在后台代码中获得Lable的值
2012-05-20 从外部的js文件中获取ASPX页面的控件ClientID
2012-05-20 js获取asp.net服务器端控件Label,TextBox,RadioButtonList,DropDownList的值
2012-05-20 用 JavaScript 验证只能输入数字,并做数字加总
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示