我有 2 個不同的物體,Entity1和Entity2,具有非常相同的屬性。它們是從 DB 的不同視圖自動生成的,每個視圖都有自己的物體型別。
我通過以下方式查詢這些物體:
protected generatedRepository<Entity1Type> _myRepository1;
_myRepository1.GetQueryable();
protected generatedRepository<Entity2Type> _myRepository2;
_myRepository2.GetQueryable();
我正在使用 OData 創建 API 端點,我必須回傳一個 IQueryable<...> 以讓用戶將 OData 過濾器應用于其請求
當我想從 回傳物體時Entity1,我只需要寫:
public IQueryable<Entity1Type> Get()
{
return _myRepository.GetQueryable();
}
并且這個新端點可以從 /api/ControllerName?$ODataFilter=... 訪問
但是,我想從_myRepository1或使用相同的端點有條件地回傳資料_myRepository2
如果我使用相同的簽名,Entity2Type必須強制轉換Entity1Type才能回傳
我試過
return _myRepository2.GetQueryable().Cast<Entity1Type>();
但它失敗了:
無法將“MyEntities2”型別轉換為“MyEntities1”型別。LINQ to Entities 僅支持轉換 EDM 原語或列舉型別。
我也試過:
return _myRepository2.GetQueryable().ToDTO<Entity2, Entity1>();
它有效,但視圖有超過 1M 行并且它加載所有行,這是不可接受的ToDto<>方法來自:https : //stackoverflow.com/a/8819149
我也嘗試關注@DavidG 評論:
Mapper.CreateMap<Entity2Type, Entity1Type>
return _myRepository2.GetQueryable().ProjectTo<Entity1>();
但它失敗了這個錯誤:
無法在 LINQ to Entities 查詢中構造物體或復雜型別 'Entity1Type'。”
如何只創建一個端點,從_myRepository1或_myRepository2以良好的性能回傳可查詢的資料?
uj5u.com熱心網友回復:
您可以嘗試使用匹配您的 2 個物體的通用 DTO 并撰寫正確的投影。
return _myRepository2.GetQueryable().Select(e2 => 'write your projection from e2 to dto')
你也一樣 entity1 :
return _myRepository1.GetQueryable().Select(e1 => 'write your projection from e1 to dto')
還有關于 ToDTO<T1, T2) 在另一篇文章中公開的內容。里面有一個“ToList()”來執行查詢。
uj5u.com熱心網友回復:
我終于找到了一個解決方案,但我不確定它是最優雅的:
我已經改變了我的Mapper.Map<>樣子:
public IQueryable<Entity2> Get(ODataQueryOptions opts)
{
Mapper.CreateMap<Entity2Type, Entity2Type>() //Yes, Entity2 to Entity2, no typo
.ForMember(d => d.Prop1, option => option.MapFrom(src => someCondition ? src.Prop1 : src.Prop2))
.ForMember(d => d.Prop3, option => option.MapFrom(src => someCondition ? src.Prop3 : src.Prop4))
.IgnoreAllNonExisting();
var query = opts.ApplyTo(_myRepository2.GetQueryable()) as IQueryable<Entity2>;
var results = Mapper.Map<IList<Entity2>>(query.ToList());
return results.AsQueryable();
}
它回傳IQueryable<EntityB>,因此我的用戶可以使用 OData 過濾器。由于ApplyTo<>(因此在執行請求之前)應用了它們,這避免了將整個表加載到記憶體中而只回傳獲取的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/358411.html
