日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NET问答: 如果动态构建 Query 查询 EntityFramework

發(fā)布時間:2023/12/4 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NET问答: 如果动态构建 Query 查询 EntityFramework 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

咨詢區(qū)

Eduard

我想知道如何在 EntityFramework 或者 Linq 上構(gòu)建動態(tài)查詢。

我現(xiàn)在要做這么一個功能,UI上大概有 50+ 的查詢條件,用戶可以根據(jù)自己的需求勾選所需的條件傳到我的后端服務(wù)方法中。

我知道可以通過 ExpresstionTree 去動態(tài)拼接這樣的條件,但我不喜歡這種方法,我想知道有沒有更簡單的方式,并且類型安全。

回答區(qū)

Slauma

你可以一步一步的組合 IQueryable<T>,起初你可以有一個 FilterDefinition 類表示可構(gòu)建的 Query 實體,類定義如下:

public?class?FilterDefinition {public?bool?FilterByName?{?get;?set;?}public?string?NameFrom?{?get;?set;?}public?string?NameTo?{?get;?set;?}public?bool?FilterByQuantity?{?get;?set;?}public?double?QuantityFrom?{?get;?set;?}public?double?QuantityTo?{?get;?set;?} }

然后你就可以像下面這樣一步步構(gòu)建 Query 語句。

public?IQueryable<SomeEntity>?GetQuery(FilterDefinition?filter) {IQueryable<SomeEntity>?query?=?context.Set<SomeEntity>();//?assuming?that?you?return?all?records?when?nothing?is?specified?in?the?filterif?(filter.FilterByName)query?=?query.Where(t?=>?t.Name?>=?filter.NameFrom?&&?t.Name?<=?filter.NameTo);if?(filter.FilterByQuantity)query?=?query.Where(t?=>?t.Quantity?>=?filter.QuantityFrom?&&?t.Quantity?<=?filter.QuantityTo);return?query; }

Gurmit Teotia

我自己封裝了一個 泛型倉儲 [https://github.com/gurmitteotia/EFDataAccess] , ?我覺得對你應(yīng)該有用,它提供了統(tǒng)一化的API接口,可參考下面的例子。

//Filter?on?known?fieldsvar?keyboard?=?Query<Product>.Create(p=>p.Category=="Keyboard");var?keyboards?=?repository.Get(keyboard);//Or?filter?on?dynamic?fieldsvar?filter?=?Query<Product>.Create("Rating",?OperationType.GreaterThan,?4)var?filteredKeyboards?=?repository.Get(filter);//You?can?also?combine?two?queries?togathervar?filterdKeyboards2?=?repository.Get(keyboard.And(filter))//Order?it?on?known?fieldsvar?orderedKeyboard?=?keyboard.OrderBy(o=>o.Asc(p=>p.Name));var?orderedKeyboards?=?repository.Get(orderedKeyboard);//Or?order?by?on?dynamic?fieldsvar?userOrdering?=?keyboard.OrderBy(o=>o.Asc("Name"));var?orderedKeyboards2?=?repository.Get(userOrdering);

雖然我不知道你的查詢 DTO,但你可以很容易的構(gòu)建泛型 Query 并塞入你的 DTO 實體,我已經(jīng)用它好多年了,絕對好用。

點評區(qū)

在純sql時代,這個需求很簡單,不斷的 += 拼接即可,反而在 強類型 下卻不是那么好做了,不過我覺得 Gurmit Teotia 大佬封裝的 Query 框架還挺好用的,支持一下。

總結(jié)

以上是生活随笔為你收集整理的NET问答: 如果动态构建 Query 查询 EntityFramework的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。