簡體   English   中英

對具有動態字段的實體的 OData 查詢

[英]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 上不存在。

我嘗試使用DynamicObjectExpandoObject創建動態 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實體進行任何查詢之前。

提前致謝!

我設法通過刪除MyObjectControllerGet方法上的EnableQuery屬性來實現它。 根據文檔,此屬性可防止惡意查詢。 它似乎也在阻止在$filter$orderby中使用任何額外的動態字段。

我不知道刪除這個屬性是否是個好主意,所以我仍然願意接受任何其他關於如何處理這個問題的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM