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查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 急需 升学宴对联 名字是良鼎 谢谢
- 下一篇: 给各位股民拜年了,预祝大家节日期间,好好