zoukankan      html  css  js  c++  java
  • 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}条记录
    
    ",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}条记录
    
    ",dbc.UPMS_User.Local.Count());
    14 
    15                 //针对本地数据的查询,不会访问数据库
    16                 var c = dbc.UPMS_User.Local.FirstOrDefault(p => p.UserId == 9);
    17                 Console.WriteLine("
    在本地查找UserId == 9的记录,可找到");
    18                 ShowIn(c);
    19 
    20                 c = dbc.UPMS_User.Local.FirstOrDefault(p => p.UserId == 11);
    21                 Console.WriteLine("
    在本地查找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("
    本地缓存中的数据为:");
    33                 ShowIn(c);
    34                 Console.WriteLine("
    数据中原始数据为:");
    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("
    数据提取完毕,显示如下:");
                    foreach (var item in clients)
                    {
                        Console.WriteLine("{0},{1}",item.UserId,item.RealName);
                    }
                    Console.WriteLine("
    数据显示完毕,共育{0}条数据:",clients.Count());
                }
            }
  • 相关阅读:
    [HNOI2008] [BZOJ1008] 越狱|组合数学
    (转)位运算简介及使用技巧
    AW297 赤壁之战(数据结构优化DP)
    AW280 陪审团
    AW288 休息时间
    AW281 硬币
    AW383 观光
    AW366 看牛 (欧拉回路)
    AW365 圆桌骑士
    AW363 B城
  • 原文地址:https://www.cnblogs.com/tangge/p/4517247.html
Copyright © 2011-2022 走看看