淺講EF高階用法之自定義函式

2022-09-10 18:15:21 字數 3239 閱讀 5654

大家先來下面這幅圖,這是我司乙個老專案的**,你可能會好奇為啥給我看sql說好的講ef哪?

大家看這個我框出來的部分,這裡呼叫了乙個sql的函式,雖然我們都在使用ef的過程中每天喊著不要使用儲存過程、函式、觸發器等sql相關的東西,但是其實真實落地到體積足夠龐大的專案後,

我們會發現,很多東西不是我們能夠左右的。當客戶執意一些東西的時候我們只能想辦法設計的更好,當然上面的圖是乙個錯誤的寫法。

這個專案中有很多實體的查詢、新增、修改需要呼叫加密、解密函式,所以這部分**都採用原生sql來做的,這非常破壞我們專案整體的**結構。

其實ef本身是支援我們呼叫sql函式的。

現在就給大家上**

首先新建3個實體

public class blog

public string url

public int? rating

public listposts

}public class post

public string title

public string content

public int rating

public int blogid

public blog blog

public listcomments

}public class comment

public string text

public int likes

public int postid

public post post

}

public dbsetpost

public dbsetcomment

protected override void onmodelcreating(modelbuilder modelbuilder)

protected override void onconfiguring(dbcontextoptionsbuilder optionsbuilder)

}先建立乙個自定義函式

create function dbo.commentedpostcountforblog(@id int)

returns int

asbegin

return (select count(*)

from [post] as [p]

where ([p].[blogid] = @id) and ((

select count(*)

from [comment] as [c]

where [p].[postid] = [c].[postid]) > 0));

end

然後在dbcontext中新增下面**,

// clr 方法的主體並不重要。 不會在客戶端呼叫此方法,除非 ef core 不能轉換其引數。 如果可以轉換引數,ef core 只關心方法簽名。

public int activepostcountforblog(int blogid)

=> throw new notsupportedexception();

// 此函式定義現在可以與模型配置中使用者定義的函式關聯

modelbuilder.hasdbfunction(typeof(bloggingcontext).getmethod(nameof(activepostcountforblog), new ))

.hasname("commentedpostcountforblog");

我們執行下面**

var query1 = from b in context.blogs

where context.activepostcountforblog(b.blogid) > 1

select b;

// 對應sql語句

select [b].[blogid], [b].[rating], [b].[url]

from [blogs] as [b]

where [dbo].[commentedpostcountforblog]([b].[blogid]) > 1

create function dbo.postswithpopularcomments(@likethreshold int)

returns table

asreturn

( select [p].[postid], [p].[blogid], [p].[content], [p].[rating], [p].[title]

from [posts] as [p]

where (

select count(*)

from [comments] as [c]

where ([p].[postid] = [c].[postid]) and ([c].[likes] >= @likethreshold)) > 0

)

public iqueryablepostswithpopularcomments(int likethreshold)

=> fromexpression(() => postswithpopularcomments(likethreshold));

modelbuilder.hasdbfunction(typeof(bloggingcontext).getmethod(nameof(postswithpopularcomments), new ));

執行下面**

var likethreshold = 3;

var query1 = from p in context.postswithpopularcomments(likethreshold)

orderby p.rating

select p;

// 對應sql語句

select [p].[postid], [p].[blogid], [p].[content], [p].[rating], [p].[title]

from [dbo].[postswithpopularcomments](@likethreshold) as [p]

order by [p].[rating]

自定義函式 Excel之自定義函式

在excel中,當系統函式不能滿足我們的需求時候,我們可以使用vba自定義函式,如抓取網頁資料,翻譯詞彙,手機號歸屬地查詢等。下面將介紹2個自定義函式,idymd函式 身份證年月日性別 通過身份證號,返回性別,出生年月日。語法 idymd id 引數 id,身份證號,預設身份證長度18位。vba 如...

Spring高階用法之自定義業務物件元件化

若干年前在使用springmvc的時候,發現springmvc可以把httpsession,httprequest元件化注入 於是花了30分鐘追蹤了相關的源 徹底摸清其原理,並且決定將使用者 user principle 也元件化 儘管當時工作處於極其忙碌的狀態,也忍不住去研究 方法如下 1.定義i...

python高階 自定義庫函式

在python使用過程中,在不同的專案裡,常常會出現頻繁地自定義同乙個函式的情況。為了解決這個問題,我們可以選擇建立乙個自定義的庫,並將其新增到系統路徑中 具體操作如下 在任意位置新建乙個專案my libs,並在其中新建python檔案my lib1和my lib2,將需要自定義的函式在my lib...