欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Entity Framework Core中執(zhí)行SQL語(yǔ)句和存儲(chǔ)過(guò)程的方法介紹

 更新時(shí)間:2022年02月21日 15:10:00   作者:Sweet-Tang  
這篇文章介紹了Entity Framework Core中執(zhí)行SQL語(yǔ)句和存儲(chǔ)過(guò)程的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

無(wú)論ORM有多么強(qiáng)大,總會(huì)出現(xiàn)一些特殊的情況,它無(wú)法滿足我們的要求。在這篇文章中,我們介紹幾種執(zhí)行SQL的方法。

表結(jié)構(gòu)

在具體內(nèi)容開始之前,我們先簡(jiǎn)單說(shuō)明一下要使用的表結(jié)構(gòu)。

    public class Category
    {

        public int CategoryID { get; set; }
        
        public string CategoryName { get; set; }
    }

Category定義了兩個(gè)字段:CategoryIDCategoryName。

    public class SampleDbContext : DbContext
    {
        public virtual DbSet<Category> Categories { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            var sqlConnectionStringBuilder = new SqlConnectionStringBuilder {
                DataSource = "10.0.1.5",
                InitialCatalog = "TestDataBase",
                UserID = "sa",
                Password = "******"
            };
            optionsBuilder.UseSqlServer(sqlConnectionStringBuilder.ConnectionString);

            base.OnConfiguring(optionsBuilder);
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            EntityTypeBuilder<Category> entityTypeBuilder = modelBuilder.Entity<Category>();
            entityTypeBuilder.ToTable("Category");
            entityTypeBuilder.HasKey(e => e.CategoryID);
            entityTypeBuilder.Property(e => e.CategoryID).UseSqlServerIdentityColumn();
        }
    }

我們使用SampleDbContext來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。

FromSql執(zhí)行SQL語(yǔ)句

Entity Framework Core為DbSet<TEntity>提供了一個(gè)擴(kuò)展方法FromSql,用于執(zhí)行SQL語(yǔ)句或存儲(chǔ)過(guò)程,以下示例使用FromSql加載所有的數(shù)據(jù)。

        using (var dataContext = new SampleDbContext()) {
        
            var query = dataContext.Categories.FromSql("select * from Category");

            var result = query.ToList();
        }

對(duì)于帶有參數(shù)的SQL語(yǔ)句,我們使用C# 6 語(yǔ)法將SQL寫成如下:

        using (var dataContext = new SampleDbContext()) {
        
            var categoryID = 1;
            
            var query = dataContext.Categories.FromSql($"select * from Category where CategoryID={categoryID}");

            var result = query.ToList();
        }

注意:這里不是直接使用拼接的方式處理SQL,而是轉(zhuǎn)化為參數(shù)化的SQL語(yǔ)句,這有助于防止SQL注入攻擊。我們可以使用SQL Server Profiler幫我們驗(yàn)證:

exec sp_executesql N'select * from Category where CategoryID=@p0
',N'@p0 int',@p0=1

如果您不使用C# 6的語(yǔ)法特征,我們必須使用 @p0、@p1 ... @pn 做為SQL語(yǔ)句的參數(shù):

        using (var dataContext = new SampleDbContext()) {

            var categoryID = 1;
            var categoryName = "Product";
            
            var query = dataContext.Categories.FromSql("select * from Category where CategoryID=@p0 and CategoryName=@p1"
            categoryID, categoryName);

            var result = query.ToList();

            Assert.NotNull(result);
        }

在上述SQL語(yǔ)句中中,將@p0映射到categoryID、@ p1映射到categoryName。

FromSql擴(kuò)展方法返回的是IQueryable<TEntity>對(duì)象,要們還可以接著使用一些Linq的方法,示例如下:

       using (var dataContext = new SampleDbContext()) {

           var categoryID = 1;

           var query = dataContext.Categories.FromSql("select * from Category")
               .Where(item => item.CategoryID == categoryID)
               .OrderBy(item => item.CategoryName);

           var result = query.ToList();
       }

不過(guò)在這里,使用的是子查詢,使用SQL Server Profiler捕獲到的SQL語(yǔ)句如下:

exec sp_executesql N'SELECT [item].[CategoryID], [item].[CategoryName]
FROM (
    select * from Category
) AS [item]
WHERE [item].[CategoryID] = @__categoryID_1
ORDER BY [item].[CategoryName]',N'@__categoryID_1 int',@__categoryID_1=1

提示:使用FromSql時(shí),需要在執(zhí)行的SQL語(yǔ)句中返回所有列,并且列名必須與實(shí)體屬性名相匹配,否則執(zhí)行會(huì)出錯(cuò)。

FromSql執(zhí)行存儲(chǔ)過(guò)程

存儲(chǔ)過(guò)程與SQL語(yǔ)句寫法基本一致,使用存儲(chǔ)過(guò)程的示例如下:

       using (var dataContext = new SampleDbContext()) {

           var categoryID = 1;
           var query = dataContext.Categories.FromSql($"GetCategoryById {categoryID}");


           var result = query.ToList();

           Assert.NotNull(result);
       }

這些參數(shù)的順序必須與存儲(chǔ)過(guò)程參數(shù)的順序一致。

提示:使用FromSql執(zhí)行存儲(chǔ)過(guò)程時(shí),如果使用'Where'、'OrderBy'等Linq語(yǔ)法,這些操作不會(huì)生成SQL語(yǔ)句,而是在.Net中對(duì)存儲(chǔ)過(guò)程返回的集合進(jìn)行過(guò)濾與排序。

ExecuteSqlCommand

DbContext暴露了一個(gè)Database屬性,它包括一個(gè)ExecuteSqlCommand方法。此方法返回一個(gè)整數(shù),表示執(zhí)行的SQL語(yǔ)句影響的行數(shù)。有效的操作是INSERT、UPDATEDELETE,不能用于返回實(shí)體。

       using (var dataContext = new SampleDbContext())
       {
           var categoryID = 1;
           var categoryName = "Product";
           
           var result = dataContext.Database.ExecuteSqlCommand($"UPDATE dbo.Category SET CategoryName={categoryName} WHERE CategoryID={categoryID}");
       }

總結(jié)

到此這篇關(guān)于Entity Framework Core中執(zhí)行SQL語(yǔ)句和存儲(chǔ)過(guò)程的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論