亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Entity Framework中執(zhí)行sql語句

 更新時(shí)間:2022年03月01日 11:27:13   作者:.NET開發(fā)菜鳥  
這篇文章介紹了Entity Framework中執(zhí)行sql語句的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、為什么要在EF中執(zhí)行SQL語句

使用EF操作數(shù)據(jù)庫,可以避免寫SQL語句,完成使用Linq實(shí)現(xiàn),但為什么還要在EF中執(zhí)行SQL語句呢。如果要寫SQL語句,完全可以使用ADO.NET來操作數(shù)據(jù)庫。這樣說雖然沒錯(cuò),可是有些時(shí)候使用EF操作數(shù)據(jù)庫還是有一些不方便的地方,例如:如果要修改某一條記錄,按照EF的正常流程走,需要先把要修改的數(shù)據(jù)查詢出來,然后在去修改,這樣不僅麻煩而且性能也低,這時(shí)直接使用EF執(zhí)行SQL語句性能會(huì)提高很多。
而使用EF執(zhí)行SQL又比ADO.NET方便,特別是在執(zhí)行查詢語句的時(shí)候,EF會(huì)把查詢到的數(shù)據(jù)自動(dòng)保存到數(shù)據(jù)實(shí)體中,省去了使用DataReader的麻煩。同時(shí)查詢出來的數(shù)據(jù)還會(huì)進(jìn)行跟蹤,如果你修改了查詢出的值,之后就可以很方便的使用.SaveChanges()直接更新到數(shù)據(jù)庫了。
在數(shù)據(jù)上下文DbContext中有一個(gè)Database的屬性,Database屬性中有兩組方法:ExecuteSqlCommand()和SqlQuery()。這兩個(gè)方法都可以用來執(zhí)行SQL語句,但這兩個(gè)方法也有不同點(diǎn):ExecuteSqlCommand()是不返回結(jié)果的,只返回受影響的行數(shù),所以ExecuteSqlCommand()更適合用來執(zhí)行創(chuàng)建、插入、更新、刪除操作(即執(zhí)行給定的DDL/DML命令)。SqlQuery()則會(huì)返回查詢到的結(jié)果,并將結(jié)果保存在數(shù)據(jù)實(shí)體中,所以SqlQuery()更適合執(zhí)行查詢操作。

二、使用ExecuteSqlCommand()執(zhí)行創(chuàng)建、插入、更新、刪除語句

ExecuteSqlCommand()的使用方法很簡單,直接傳入SQL語句就可以了,執(zhí)行完成后會(huì)返回受影響的行數(shù)。
在下面的例子中,entity是一個(gè)繼承自DbContext的對象。

1、執(zhí)行創(chuàng)建語句

// 執(zhí)行創(chuàng)建語句
string strCreateSQL = @"CREATE table test( id int primary key not null,name varchar(16),password varchar(20))";
 // 注意:執(zhí)行create語句受影響的行數(shù)是-1
int result = entity.Database.ExecuteSqlCommand(strCreateSQL);
if (result.Equals(-1))
{
    Console.WriteLine("創(chuàng)建成功!");
}

 2、執(zhí)行Insert語句

// 執(zhí)行Insert語句
string strInsertSQL = @"INSERT INTO test
                                        SELECT 1,'小明','1234' UNION
                                        SELECT 2,'小王','1234' UNION
                                        SELECT 3,'小紅','1234'  ";
int result = entity.Database.ExecuteSqlCommand(strInsertSQL);
if (result > 0)
{
       Console.WriteLine("插入成功");
}

3、執(zhí)行Update語句

// 執(zhí)行Update語句
string strUpdateSQL = @"UPDATE test SET password=@pwd1 WHERE id=@id1;
UPDATE test SET password=@pwd2 WHERE id=@id2;";
                SqlParameter[] para =  {
                   new  SqlParameter("@pwd1","ceshi12we"),
                   new  SqlParameter("@id1",1),
                   new  SqlParameter("@pwd2","ceshi127890"),
                   new  SqlParameter("@id2",2),
                };

int result = entity.Database.ExecuteSqlCommand(strUpdateSQL, para);
if (result > 0)
{
    Console.WriteLine("更新成功");
}

4、執(zhí)行Delete語句

// 執(zhí)行刪除語句
string strDelSQL = "delete from test";
int result = entity.Database.ExecuteSqlCommand(strDelSQL);
if (result > 0)
{
     Console.WriteLine("刪除成功");
}

5、執(zhí)行Drop語句

string strDropSQL = "drop table test";
int result = entity.Database.ExecuteSqlCommand(strDropSQL);
if (result.Equals(-1))
{
    Console.WriteLine("刪除成功");
}

注意:執(zhí)行DDL語句(create、alter、drop等)返回值是-1,DML(insert、update、delete)返回的是受影響的行數(shù)。

三、使用SqlQuery()查詢數(shù)據(jù)

SqlQuery()是用來執(zhí)行查詢的。SqlQuery()使用前需要指定返回值的類型。返回值類型可以是定義的實(shí)體類型,或者基元類型。例如:查詢一個(gè)用戶的完整信息,返回類型就是用戶實(shí)體類型;如果是統(tǒng)計(jì)有多少個(gè)用戶,返回值就是int類型。
注意:返回值的個(gè)數(shù)和名稱必須和傳入的類型中屬性個(gè)數(shù)、名稱相同,不如會(huì)報(bào)錯(cuò)。

在下面的例子中User是根據(jù)數(shù)據(jù)庫表生成的實(shí)體類型。

string strSQL = "SELECT * FROM Users WHERE ID>=10 ORDER BY ID DESC";
var info = entity.Database.SqlQuery<User>(strSQL);
foreach (var item in info)
{
       Console.WriteLine("ID:" + item.ID + " " + "登錄名:" + item.LoginName + " " + "密碼:" + item.Password);
}

運(yùn)行結(jié)果:

前面說過返回值的個(gè)數(shù)和名稱必須和傳入的類型中屬性個(gè)數(shù)、名稱相同,不如會(huì)報(bào)錯(cuò)。如果將SQL語句修改為只查詢ID、登錄名、密碼會(huì)出現(xiàn)下面的錯(cuò)誤:

如果只想查詢ID、登錄名、密碼該怎么辦呢?那就需要單獨(dú)定義一個(gè)類(只包含ID、登錄名、密碼三個(gè)屬性)來保存數(shù)據(jù).

新定義的類,只包含ID、登錄名、密碼三個(gè)屬性:

public class newUser
{
        public int ID { get; set; }

        public string LoginName { get; set; }

        public string Password { get; set; }
}
// 方法四:SqlQuery
try
{
                string strSQL = "SELECT ID,LoginName,Password FROM Users WHERE ID>=10 ORDER BY ID DESC";
                var info = entity.Database.SqlQuery<newUser>(strSQL);
                foreach (var item in info)
                {
                    Console.WriteLine("ID:" + item.ID + " " + "登錄名:" + item.LoginName + " " + "密碼:" + item.Password);
                }
}
catch (Exception ex)
{
                Console.WriteLine(ex.Message);
}

運(yùn)行結(jié)果:

返回值是基元類型:

查詢用戶數(shù)量,返回int類型

// 查詢用戶數(shù)量
string strSQL = "SELECT COUNT(*) FROM test";
var result = entity.Database.SqlQuery<int>(strSQL);
// 注意:必須使用循環(huán)才會(huì)真正的去數(shù)據(jù)庫執(zhí)行SQL語句,否則不會(huì)再數(shù)據(jù)庫執(zhí)行SQL語句(EF的延遲加載)
foreach(var item in result)
{
     Console.WriteLine("用戶數(shù)量:" + item.ToString());
}

運(yùn)行結(jié)果:

四、使用DbSet<T>下的SqlQuery()

在每個(gè)數(shù)據(jù)實(shí)體集合DbSet<T>下也有一個(gè)SqlQuery(),功能與上面介紹的一樣,只不過DbSet<T>下的SqlQuery()只能返回DbSet<T>中包含的類型,DbSet<T>下的SqlQuery()在返回?cái)?shù)據(jù)的同時(shí)還會(huì)讓數(shù)據(jù)庫上下文(DBContext)跟蹤返回?cái)?shù)據(jù)的狀態(tài),如果返回的數(shù)據(jù)發(fā)生了修改,就可以使用SaveChanges()將結(jié)果直接保存回?cái)?shù)據(jù)庫。而Database.SqlQuery()查出的結(jié)果則不能跟蹤返回?cái)?shù)據(jù)的狀態(tài)。

1、使用實(shí)體集合下面的SqlQuery()方法

string strSQL = "SELECT * FROM Users WHERE UserID='002068'";
User user = entity.Users.SqlQuery(strSQL).FirstOrDefault();
user.Password = "測試實(shí)體下面的SqlQuery方法";
// 調(diào)用SaveChanges()方法可以更新Password字段
entity.SaveChanges();

2、使用Database下的SqlQuery()方法

string strSQL = "SELECT * FROM Users WHERE UserID='002068'";
User user = entity.Database.SqlQuery<User>(strSQL).FirstOrDefault();
user.Password = "測試Database下面的SqlQuery方法";
// 調(diào)用SaveChanges()方法不可以更新Password字段
entity.SaveChanges();

如果希望使用Database下的SqlQuery()查詢出的數(shù)據(jù)在修改后也能保存到數(shù)據(jù)庫,可以使用下面的代碼:

string strSQL = "SELECT * FROM Users WHERE UserID='002068'";
User user = entity.Database.SqlQuery<User>(strSQL).FirstOrDefault();
user.Password = "測試Database下面的SqlQuery方法";
// 設(shè)置這條數(shù)據(jù)的狀態(tài)是:Modified,這樣可以通知數(shù)據(jù)上下文,這條記錄也被修改了
entity.Entry<User>(user).State = System.Data.Entity.EntityState.Modified;
// 調(diào)用SaveChanges()方法不可以更新Password字段
entity.SaveChanges();

到此這篇關(guān)于Entity Framework中執(zhí)行sql語句的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決.net framework 4.0環(huán)境下遇到版本不同編譯不通過的方法詳解

    解決.net framework 4.0環(huán)境下遇到版本不同編譯不通過的方法詳解

    本篇文章是對.net framework 4.0環(huán)境下遇到版本不同編譯不通過的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 使用DataTable更新數(shù)據(jù)庫(增,刪,改)

    使用DataTable更新數(shù)據(jù)庫(增,刪,改)

    使用DataTable更新數(shù)據(jù)庫(增,刪,改),需要的朋友可以參考一下
    2013-03-03
  • .NET?6中間件Http?Logging使用介紹

    .NET?6中間件Http?Logging使用介紹

    這篇文章介紹了.NET?6中間件Http?Logging的使用方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • SQL Server LocalDB 在 ASP.NET中的應(yīng)用介紹

    SQL Server LocalDB 在 ASP.NET中的應(yīng)用介紹

    如同交響樂一樣,構(gòu)造軟件系統(tǒng)不一定必須某個(gè)強(qiáng)大的明星驅(qū)動(dòng),我們站在歷代ADO.NET的肩膀上,更好地回歸到SQL Server的核心開發(fā):SQL Server LocalDB 在 ASP.NET中的應(yīng)用
    2013-01-01
  • ASP.NET MVC實(shí)現(xiàn)橫向展示購物車

    ASP.NET MVC實(shí)現(xiàn)橫向展示購物車

    這篇文章介紹了ASP.NET MVC實(shí)現(xiàn)橫向展示購物車的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • ASP.NET Core Web App應(yīng)用第三方Bootstrap模板的方法教程

    ASP.NET Core Web App應(yīng)用第三方Bootstrap模板的方法教程

    這篇文章主要給大家介紹了關(guān)于ASP.NET Core Web App應(yīng)用第三方Bootstrap模板的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧
    2018-06-06
  • OpenCms 帶分頁的新聞列表

    OpenCms 帶分頁的新聞列表

    有一些網(wǎng)友在新聞列表分頁上還遇到一些問題,正好這個(gè)blog上也忘記了此部分內(nèi)容,現(xiàn)在補(bǔ)充上,功能是實(shí)現(xiàn)了,可以自己再做些優(yōu)化,OpenCms7.0.5下測試通過,內(nèi)容如下(編輯器的插入代碼功能有問題,就直接把代碼粘上了
    2008-07-07
  • 淺談ASP.NET Core 2.0 帶初始參數(shù)的中間件(譯)

    淺談ASP.NET Core 2.0 帶初始參數(shù)的中間件(譯)

    這篇文章主要介紹了淺談ASP.NET Core 2.0 帶初始參數(shù)的中間件(譯),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-10-10
  • asp.net 提高網(wǎng)站速度及如何利用緩存

    asp.net 提高網(wǎng)站速度及如何利用緩存

    ASP.NET提供三種主要形式的緩存:頁面級輸出緩存、用戶控件級輸出緩存(或稱為片段緩存)和緩存API。
    2010-01-01
  • 詳解.net core下如何簡單構(gòu)建高可用服務(wù)集群

    詳解.net core下如何簡單構(gòu)建高可用服務(wù)集群

    一說到集群服務(wù)相信對普通開發(fā)者來說肯定想到很復(fù)雜的事情,這篇文章主要介紹了詳解.net core下如何簡單構(gòu)建高可用服務(wù)集群,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01

最新評論