您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Entity Framework如何使用LINQ操作實體,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
LINQ,全稱是Language-INtegrated Query(集成語言查詢),是.NET語言中查詢數(shù)據(jù)的一種技術(shù)。LINQ to Entities是一種機制,它促進了使用LINQ對概念模型的查詢。
因為LINQ是聲明式語言,它讓我們聚焦于我們需要什么數(shù)據(jù)而不是應(yīng)該如何檢索數(shù)據(jù)。LINQ to Entities在實體數(shù)據(jù)模型之上提供了一個很好的抽象,所以我們可以使用LINQ來指定檢索什么數(shù)據(jù),然后LINQ to Entities provider會處理訪問數(shù)據(jù)庫事宜,并為我們?nèi)〉奖匾臄?shù)據(jù)。
當(dāng)我們使用LINQ to Entities對實體數(shù)據(jù)模型執(zhí)行LINQ查詢時,這些LINQ查詢會首先被編譯以決定我們需要獲取什么數(shù)據(jù),然后執(zhí)行編譯后的語句,從應(yīng)用程序的角度看,最終會返回.NET理解的CLR對象。
上圖展示了LINQ to Entities依賴EntityClient才能夠使用EF的概念數(shù)據(jù)模型
執(zhí)行流程:
1、應(yīng)用程序創(chuàng)建一個LINQ查詢。
2、LINQ to Entities會將該LINQ查詢轉(zhuǎn)換成EntityClient命令。
3、EntityClient命令然后使用EF和實體數(shù)據(jù)模型將這些命令轉(zhuǎn)換成SQL查詢。
4、然后會使用底層的ADO.NET provider將該SQL查詢傳入數(shù)據(jù)庫。
5、該查詢?nèi)缓笤跀?shù)據(jù)庫中執(zhí)行。
6、執(zhí)行結(jié)果返回給EF。
7、EF然后將返回的結(jié)果轉(zhuǎn)換成CLR類型,比如領(lǐng)域?qū)嶓w。
8、EntityClient使用項目,并返回必要的結(jié)果給應(yīng)用程序。
使用LINQ查詢的方式有兩種:
1、查詢語法。
2、方法語法。
選擇哪種語法完全取決于你的習(xí)慣,兩種語法的性能是一樣的。查詢語法相對更容易理解,但是靈活性稍差;相反,方法語法理解起來有點困難,但是提供了更強大的靈活性。使用方法語法可以進行鏈接多個查詢,因此在單個語句中可以實現(xiàn)最大的結(jié)果。
下面以一個簡單的例子來理解一下這兩種方法的區(qū)別。創(chuàng)建一個控制臺程序,并命名。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LINQDemo.Model { public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public DateTime PublicationDate { get; set; } } }
using LINQDemo.Model; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LINQDemo.EF { public class SeedingDataInitializer : DropCreateDatabaseAlways<Context> { /// <summary> /// 初始化種子數(shù)據(jù) /// </summary> /// <param name="context"></param> protected override void Seed(Context context) { context.Books.Add(new Book { Name = "C#高級編程(第十版)", Author = "小明", PublicationDate = Convert.ToDateTime("2017-12-11 12:12:45") }); context.Books.Add(new Book { Name = "oracle從入門到精通", Author = "張三", PublicationDate = Convert.ToDateTime("2015-12-11 12:12:45") }); context.Books.Add(new Book { Name = "JavaScript高級編程", Author = "李四", PublicationDate = Convert.ToDateTime("2011-09-11 12:12:45") }); base.Seed(context); } } }
using LINQDemo.Model; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LINQDemo.EF { public class Context :DbContext { public Context() : base("AppConnection") { Database.SetInitializer<Context>(new SeedingDataInitializer()); } // 添加到數(shù)據(jù)上下文 public virtual DbSet<Book> Books { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 設(shè)置生成的表名:Book modelBuilder.Entity<Book>().ToTable("Book"); base.OnModelCreating(modelBuilder); } } }
using LINQDemo.EF; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LINQDemo { class Program { static void Main(string[] args) { using (var context = new Context()) { #region 查詢語法 var result = from p in context.Books where p.Name.Equals("JavaScript高級編程") select p; #endregion #region 方法語法 var books = context.Books.Where(p => p.Name.Equals("JavaScript高級編程")); foreach (var item in books) { Console.WriteLine(string.Format("書名:{0},作者:{1},發(fā)布時間:{2}", item.Name, item.Author, item.PublicationDate)); } #endregion } Console.WriteLine("完成"); Console.ReadKey(); } } }
查看數(shù)據(jù)庫結(jié)果:
查詢語法和方法語法的執(zhí)行結(jié)果都是一樣的。
重點理解:
當(dāng)使用LINQ to Entities時,理解何時使用IEnumerable和IQueryable很重要。如果使用了IEnumerable,查詢會立即執(zhí)行,如果使用了IQueryable,直到應(yīng)用程序請求查詢結(jié)果的枚舉時才會執(zhí)行查詢,也就是查詢延遲執(zhí)行了,延遲到的時間點是枚舉查詢結(jié)果時。
如何決定使用IEnumerable還是IQueryable呢?使用IQueryable會讓你有機會創(chuàng)建一個使用多條語句的復(fù)雜LINQ查詢,而不需要每條查詢語句都對數(shù)據(jù)庫執(zhí)行查詢。該查詢只有在最終的LINQ查詢要求枚舉時才會執(zhí)行。
關(guān)于“Entity Framework如何使用LINQ操作實體”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。