Entity Framework Code First使用DbContext查詢

来源:http://www.cnblogs.com/wufei999/archive/2017/02/23/6431666.html
-Advertisement-
Play Games

DbContext、DbSet及DbQuery是Entity Framework Code First引入的3個新的類,其中DbContext用於保持資料庫會話連接,實體變化跟蹤及保存,DbSet用於暫存實體類的變化跟蹤,DbQuery用於提供查詢跟你。 1、使用Set查詢全部記錄 使用DbCont ...


  DbContext、DbSet及DbQuery是Entity Framework Code First引入的3個新的類,其中DbContext用於保持資料庫會話連接,實體變化跟蹤及保存,DbSet用於暫存實體類的變化跟蹤,DbQuery用於提供查詢跟你。

  1、使用Set查詢全部記錄

  使用DbContext查詢首先需要保證DbContext的實例在使用完之後對資源的釋放,釋放DbContext實例資源的方法有兩種:採用using代碼塊結構和調用DbContext實例的Dispose()方法。

using (var ctx = new PortalContext())
{
    foreach (var province in ctx.Provinces)
    {
        Console.WriteLine(province.ProvinceName);
    }
}
using (var ctx = new PortalContext())
{
    foreach (var province in ctx.Set<Province>())
    {
        Console.WriteLine(province.ProvinceName);
    }
}

  2、使用LINQ排序、篩選等

  1>、LINQ排序

  LINQ表達式排序:

using (var ctx = new PortalContext())
{
    var provinces = from p in ctx.Provinces
                    orderby p.ProvinceNo
                    select p;
    foreach (var province in provinces)
    {
        Console.WriteLine(province.ProvinceName);
    }
}

  LINQ表達式多欄位排序:

using (var ctx = new PortalContext())
{
    var provinces = from p in ctx.Provinces
                    orderby p.ProvinceNo descending, p.ProvinceName ascending
                    select p;
    foreach (var province in provinces)
    {
        Console.WriteLine(province.ProvinceName);
    }
}

  LINQ擴展方法排序:

using (var ctx = new PortalContext())
{
    var provinces = ctx.Provinces
        .OrderBy(p => p.ProvinceNo);

    foreach (var province in provinces)
    {
        Console.WriteLine(province.ProvinceName);
    }
}

  LINQ擴展方法多欄位排序:

var provinces = ctx.Provinces
    .OrderByDescending(p => p.ProvinceNo)
    .ThenBy(p => p.ProvinceName);

foreach (var province in provinces)
{
    Console.WriteLine(province.ProvinceName);
}

  註:在採用LINQ擴展方法進行多欄位排序時,多出現多個OrderBy,則只按最後一個OrderBy欄位進行排序。

  如下示例只會按照ProvinceName進行升序排序:

var provinces = ctx.Provinces
    .OrderByDescending(p => p.ProvinceNo)
    .OrderBy(p => p.ProvinceName);

  2>、LINQ篩選

  LINQ表達式篩選:

using (var ctx = new PortalContext())
{
    var cities = from c in ctx.Cities
                 where c.ProvinceID == 3
                 select c;

    foreach (var city in cities)
    {
        Console.WriteLine(city.CityName);
    }
}

  LINQ表達式多欄位篩選:

using (var ctx = new PortalContext())
{
    var cities = from c in ctx.Cities
                 where c.ProvinceID == 3 && c.CityID > 10
                 select c;

    foreach (var city in cities)
    {
        Console.WriteLine(city.CityName);
    }
}

  LINQ表達式篩選與排序:

using (var ctx = new PortalContext())
{
    var cities = from c in ctx.Cities
                 where c.ProvinceID == 3 && c.CityID > 10
                 orderby c.CityID
                 select c;

    foreach (var city in cities)
    {
        Console.WriteLine(city.CityName);
    }
}

  LINQ擴展方法篩選:

using (var ctx = new PortalContext())
{
    var cities = ctx.Cities
        .Where(c => c.ProvinceID == 3);

    foreach (var city in cities)
    {
        Console.WriteLine(city.CityName);
    }
}

  LINQ擴展方法多欄位篩選:

using (var ctx = new PortalContext())
{
    var cities = ctx.Cities
        .Where(c => c.ProvinceID == 3 && c.ProvinceID > 10);

    foreach (var city in cities)
    {
        Console.WriteLine(city.CityName);
    }
}

  LINQ擴展方法多欄位篩選及排序:

var cities = ctx.Cities
    .Where(c => c.ProvinceID == 3 && c.ProvinceID > 10)
    .OrderBy(c=>c.CityID);

  3>、LINQ選擇讀取欄位

  LINQ表達式讀取1個欄位:

var cities = from c in ctx.Cities
             where c.ProvinceID == 3 && c.CityID > 10
             select c.CityName;

  LINQ表達式讀取多個欄位:

var cities = from c in ctx.Cities
             where c.ProvinceID == 3 && c.CityID > 10
             select new { c.CityID, c.CityName };

  LINQ擴展方法讀取1個欄位:

using (var ctx = new PortalContext())
{
    var citieNames = ctx.Cities
        .Where(c => c.ProvinceID == 3 && c.ProvinceID > 10)
        .OrderBy(c => c.CityID)
        .Select(c => c.CityName);

    foreach (var cityName in citieNames)
    {
        Console.WriteLine(cityName);
    }
}

  LINQ擴展方法讀取多個欄位:

using (var ctx = new PortalContext())
{
    var cities = ctx.Cities
        .Where(c => c.ProvinceID == 3 && c.ProvinceID > 1)
        .OrderBy(c => c.CityID)
        .Select(c => new { c.CityID, c.CityName });

    foreach (var c in cities)
    {
        Console.WriteLine("{0}-{1}", c.CityID, c.CityName);
    }
}

  3、查詢本地數據

  Entity Framework Code First通過DbSet的Local屬性查詢本地數據,查詢本地數據的使用情況:1>當需要查詢的數據已經存在與記憶體中,而不想再次發送SQL語句到資料庫中取查詢;2>當最新的數據還只在記憶體中而未提交到資料庫的情況對記憶體數據進行查詢。

  示例:初始時本地未載入記憶體數據

using (var ctx = new PortalContext())
{
    var count = ctx.Cities.Local.Count;
    Console.WriteLine("Cities in memory:{0}", count);
}

  執行後返回的結果:

  Cities in memory:0

  示例:先通過查詢,將數據載入到記憶體

using (var ctx = new PortalContext())
{
    foreach (var city in ctx.Cities)
    {
        Console.WriteLine(city.CityName);
    }

    var count = ctx.Cities.Local.Count;
    Console.WriteLine("Cities in memory:{0}", count);
}

  執行後返回的結果:

  ......

  Cities in memory:342

  3.2>、使用Load方法將數據載入到記憶體

using (var ctx = new PortalContext())
{
    ctx.Cities.Load();
    var count = ctx.Cities.Local.Count;
    Console.WriteLine("Cities in memory:{0}", count);
}

  執行後的結果:

  Cities in memory:342

using (var ctx = new PortalContext())
{
    var expr = from c in ctx.Cities
               select c;
    expr.Load();
    var count = ctx.Cities.Local.Count;
    Console.WriteLine("Cities in memory:{0}", count);
}

  3.2>、基於本地數據進行查詢

using (var ctx = new PortalContext())
{
    ctx.Cities.Load();
    var cities = from c in ctx.Cities.Local
                orderby c.ProvinceID
                select c;
    foreach (var city in cities)
    {
        Console.WriteLine("{0}", city.CityName);
    }
}

  清除記憶體數據:

ctx.Cities.Local.Clear();

  4、查詢單個對象

  DbContext API可以使用DbSet.Find來查詢返回單個對象,DbSet.Find接受的參數值為需要查詢的主鍵值,若未找到符合條件的主鍵值則返回null。

  Find查找單個對象的規則:

  1>、從記憶體中查找已經存在的從資料庫中載入出來的實體或已經被附加到DbContext的實體;

  2>、查找新添加的但還未被提交保存到資料庫中的實體對象;

  3>、到資料庫中取查找還未載入到記憶體中的實體對象。

using (var ctx = new PortalContext())
{
    var city = ctx.Cities.Find(1);

    if (city != null)
    {
        Console.WriteLine(city.CityName);
    }
    else
    {
        Console.WriteLine("City not found!");
    }
}

  若實體類具有多個主鍵,則Find方法同樣接受全部主鍵的參數值,參數的順序必須與主鍵列的順序相同。

var city = ctx.Cities.Find(keyID, cityID);

  Single方法也可以用於查詢後返回單個對象:

using (var ctx = new PortalContext())
{
    var expr = from c in ctx.Cities
                where c.CityID == 1
                select c;

    var city = expr.Single();
}

  SingleOrDefault方法查詢返回單個對象:

using (var ctx = new PortalContext())
{
    var expr = from c in ctx.Cities
                where c.CityID == 1
                select c;
    var city = expr.SingleOrDefault();
    if (city != null)
    {
        Console.WriteLine(city.CityName);
    }
    else
    {
        Console.WriteLine("City not found!");
    }
}

  Single與SingleOrDefault方法的區別在於:當不存在滿足條件的單個實體時,Single將直接拋出異常,而SingleOrDefault則返回class類型的預設值null。

參考頁面:http://qingqingquege.cnblogs.com/p/5933752.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 將hdfs里name與data清空,和將tmp清空 然後在hadoop目錄下運行 hadoop namenode -format 啟動 sbin/start-all.sh ...
  • Redis目前對事物的支持相對簡單。Redis只能保證一個client發起的事務中的命令可以連續的執行,而中間不會插入其他的client命令。當一個client在一個鏈接中發出multi命令時,這個鏈接會進入一個事務上下文,該連接後續的命令不會立即執行,而是先放到一個隊列中,當執行exec命令時,r... ...
  • ........ http://blog.csdn.net/se7en_q/article/details/47258007 ...
  • Redis的複製功能是支持多個資料庫之間的數據同步。一類是主資料庫(master)一類是從資料庫(slave),主資料庫可以進行讀寫操作,當發生寫操作的時候自動將數據同步到從資料庫,而從資料庫一般是只讀的,並接收主資料庫同步過來的數據,一個主資料庫可以有多個從資料庫,而一個從資料庫只能有一個主資料庫... ...
  • Redis速度很快,所以在一臺比較好的服務起下,一個外部的用戶可以在1秒鐘進行150k次的密碼嘗試連接,所以我們需要設置非常強大的密碼來防止暴力破解。 ...
  • create database 資料庫名; 創建一個資料庫即可解決,具體原因還未知 ...
  • String是最簡單的類型,一個key對應一個Value,string類型是二進位安全的。redis的string可以包含任何數據類型,比如jpg圖片或者序列化的對象。 Redis hash 是一個string類型的filed和value的映射表、它的添加、刪除操作都是0、1(平均操作)。Hash特... ...
  • SQLServer資料庫的基礎知識的回顧: 1)主數據文件:*.mdf 2)次要數據文件:*.ndf 3)日誌文件:*.ldf 每個資料庫至少要包含兩個文件:一個數據文件和一個日誌文件 如何查看SQL Server的幫助 快捷鍵F1 一、創建文件夾 exec sp_configure 'show a ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...