大家先來下面這幅圖,這是我司乙個老專案的**,你可能會好奇為啥給我看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...