NET问答: 如果动态构建 Query 查询 EntityFramework
咨詢區(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web通用令牌JwtBuilder
- 下一篇: 网关Ocelot功能演示完结,久等了~~