EF Linq 框架使用過程中的小技巧彙總

2022-01-19 15:39:31 字數 2452 閱讀 4014

這篇部落格總結本人在實際專案中遇到的一些關於ef或者linq的問題,作為以後複習的筆記或者供後來人參考(遇到問題便更新)。

有沒有遇到做這樣的錯誤:
var query = from order in _orderrepository.getall()

.where(o => o.ordertype == ordertype.linesold)

.whereif(input.orderdate!=datetime.minvalue,o=>o.orderdate.date==input.orderdate.date)

.whereif(!string.isnullorempty(input.orderno),o=>o.orderno==input.orderno||o.orderno.endswith(input.orderno))

.whereif(input.status!=-1,o=>o.status==input.status)

join device in _devicerepository.getall()

.whereif(!string.isnullorempty(input.code),d=>d.code==input.code) on order.terminalid equals device.id

join trans in _transdetailrepository.getall()

.whereif(!string.isnullorempty(input.payorderno),t=>t.payorderno==input.payorderno||t.payorderno.endswith(input.payorderno))

on order.orderno equals trans.orderno into leftjoinresults

from leftjoinresult in leftjoinresults.defaultifempty( )

select new linesoldorderoutput

;

為啥有這種需求?

因為資料庫中的datetime型別都是以2016-03-11 11:25:59這種形式儲存的,而我在客戶端查詢資料時,只要傳入日期就行,不需要傳入時間部分,所以必須把時間部分咔嚓掉(剪掉)。

正如上面的**第三行,一開始是那麼寫的,結果報上面的第二種錯誤。

第二次改成了.whereif(input.orderdate!=datetime.minvalue,o=>o.orderdate.toshortdatestring()==input.orderdate.toshortdatestring()),結果報上面的第一種錯誤。

解決辦法

.whereif(input.orderdate!=datetime.minvalue,o=>dbfunctions.truncatetime(o.orderdate)【我用的是ef6,truncate,翻譯為截斷,該函式顧名思義也就是把時間部分去掉,只保留日期部分】

ef6以前你可能需要用entityfunctions.truncatetime(p.date) == datewithouttime

其他重點

我上面的**還有使用linq進行三張表的連線,更重要的是,前兩張表是內連線,之後再進行左連線。不熟悉linq語法的可以學習一下。

有時候,在處理資料的時候,需要對資料進行分組,而且是對datetime型別的字段按照年月進行分組,下面分別使用linq的方法語法和查詢語法進行分組:

方法語法

dateincomedtos = query

.where(o => o.orderdate >= input.start && o.orderdate < dbfunctions.addmonths(input.end,1))

.orderby(o => o.orderdate)

.groupby(o => dbfunctions.createdatetime(o.orderdate.year, o.orderdate.month, 1, 0, 0, 0))

.select(group => new dateincomedto );

查詢語法
dateincomedtos = from q in query

group q by new

into g

select new dateincomedto

;

方法語法使用的是linq中提供的dbfunctions類中的createdatetime方法,給day的引數傳入乙個1至29中的整數,保證每個月中有這一天即可(我這裡傳入了1),這樣,在分組的時候,ef就會將資料庫中的每條記錄的orderdate欄位的年和月進行分組。

查詢語法思想是一樣的,只不過用到了匿名類而已。

element ui dialog使用過程中的坑

場景一 我們將dialog寫成乙個可復用的公共元件用於顯示不同內容 如 操作中的修改或新增的彈窗 之後發現dialog的遮罩將彈出層 點選修改或新增後理應由乙個彈窗顯示出來 都蓋住了,而我想要的效果是遮罩只遮住舊的視窗,而當前視窗應該完全顯示 注 是使用easyui的panel和window來包裹的...

robotframework使用過程中的一些總結

robot framework是乙個基於python可擴充套件地關鍵字驅動的測試自動化框架,robot framework被廣泛地使用在端到端地驗收測試以及驗收測試驅動開發的過程中。1.在rf中輸入部分關鍵字的名稱時,使用shift control 空格可以延伸出所有相關的關鍵字 2.suit下打t...

python使用過程中問題

1.檢視python支援的 whl格式 在cmd輸入python 或者 python3.6 import pip print pip.pep425tags.get supported 2.在修改python.exe為python36.exe 任何重新命名 後,pip會報錯 fatal error i...