日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Entity Framework Code First使用DbContext查询

發布時間:2024/8/24 编程问答 39 如意码农
生活随笔 收集整理的這篇文章主要介紹了 Entity Framework Code First使用DbContext查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  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 ==
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 == && c.CityID >
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 == && c.CityID >
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 == ); foreach (var city in cities)
{
Console.WriteLine(city.CityName);
}
}

  LINQ擴展方法多字段篩選:

using (var ctx = new PortalContext())
{
var cities = ctx.Cities
.Where(c => c.ProvinceID == && c.ProvinceID > ); foreach (var city in cities)
{
Console.WriteLine(city.CityName);
}
}

  LINQ擴展方法多字段篩選及排序:

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

  3>、LINQ選擇讀取字段

  LINQ表達式讀取1個字段:

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

  LINQ表達式讀取多個字段:

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

  LINQ擴展方法讀取1個字段:

using (var ctx = new PortalContext())
{
var citieNames = ctx.Cities
.Where(c => c.ProvinceID == && c.ProvinceID > )
.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 == && c.ProvinceID > )
.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(); 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 ==
select c; var city = expr.Single();
}

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

using (var ctx = new PortalContext())
{
var expr = from c in ctx.Cities
where c.CityID ==
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。

總結

以上是生活随笔為你收集整理的Entity Framework Code First使用DbContext查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。