[英]OData Queries on Entities with Dynamic Fields
我在動態 model 上使用OData。MyObject數據以兩種不同的方式存儲在數據庫中 - 在MyObject
MyObject
表和鍵/值對的輔助表中。 輔助表允許的字段名稱存儲在第三個表中。 使用PIVOT ,我可以檢索包含 static 和動態字段的MyObject
項目列表。 如果我將構建器的EntitySet
分配給MyObject
model,我也可以在任何 static 字段上使用$top
、 $filter
和$orderby
。但是,我無法將$filter
或$orderby
與任何動態字段一起使用,因為它們在MyObject
model 上不存在。
我嘗試使用DynamicObject
或ExpandoObject
創建動態 model 並使用代替MyObject
,但我仍然無法在之前未定義的任何字段上運行$filter
或$orderby
。 在每種情況下,代碼在到達 controller 之前都會失敗,並顯示一條消息,指出該字段在分配給構建器的任何 model 上都不存在。 由於我需要考慮到不同的用戶有不同的字段,以及允許自動包含新字段,所以我不知道如何設置。
在Startup.cs
ConfigureServices
中,我有以下內容:
services.AddControllers(options =>
{
options.ModelBinderProviders.RemoveType<DateTimeModelBinderProvider>();
})
.AddOData(opt =>
opt.AddRouteComponents("odata", GetEdmModel())
.Expand()
.Select()
.OrderBy()
.Filter()
.Count()
.SkipToken()
)
.AddNewtonsoftJson();
GetEdmModel
方法如下:
var builder = new ODataConventionModelBuilder();
builder.EntitySet<MyObject>("MyObjectController");
builder.EntityType<MyObject>().HasKey(k => k.Id);
return builder.GetEdmModel();
我對設置OData不是很熟悉。 有沒有辦法使用EntitySet
和 class 可以動態改變? 或者有沒有辦法在EntityType
中定義可以解釋動態字段的內容? 當用戶調用 controller 時,我可以獲得這些字段的列表 - 在需要對MyObject
實體進行任何查詢之前。
提前致謝!
我設法通過刪除MyObjectController
的Get
方法上的EnableQuery
屬性來實現它。 根據文檔,此屬性可防止惡意查詢。 它似乎也在阻止在$filter
和$orderby
中使用任何額外的動態字段。
我不知道刪除這個屬性是否是個好主意,所以我仍然願意接受任何其他關於如何處理這個問題的建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.