我試圖有一個動態檢索函式,我可以傳入一個自定義型別的 .Select() 選擇器。
public IEnumerable<BookableResourceBooking> RetrieveBookingsForWorkOrder(Guid workOrderId, Expression<Func<BookableResourceBooking, dynamic>> selector)
{
return (IEnumerable<BookableResourceBooking>)
CrmServiceContext.BookableResourceBookingSet
.Where(x => x.msdyn_WorkOrder.Id == workOrderId)
.Select(selector);
}
我這樣稱呼它:
.RetrieveBookingsForWorkOrder(
workOrderId,
x => new BookableResourceBooking() { Id = x.Id, StartTime = x.StartTime, EndTime = x.EndTime })
這會引發錯誤:
Microsoft.Xrm.Sdk.InvalidPluginExecutionException:'無法將'Microsoft.Xrm.Sdk.Linq.Query`1[System.Object]型別的物件轉換為'System.Collections.Generic.IEnumerable`1[GiGA.Common。 Crm.BookableResourceBooking]'。
如果我手動將選擇器放在那里,它可以作業:
.Select(x => new BookableResourceBooking() { Id = x.Id, StartTime = x.StartTime, EndTime = x.EndTime }); // this is fine
我應該如何使用引數中的選擇器呼叫函式?
uj5u.com熱心網友回復:
就編譯后的 IL 而言,型別dynamic是一樣的。object它只是告訴編譯器不要在未找到的方法上拋出錯誤。
所以這段代碼:
public IEnumerable<BookableResourceBooking> RetrieveBookingsForWorkOrder(
Guid workOrderId, Expression<Func<BookableResourceBooking, dynamic>> selector)
{
return (IEnumerable<BookableResourceBooking>)
CrmServiceContext.BookableResourceBookingSet
.Where(x => x.msdyn_WorkOrder.Id == workOrderId)
.Select(selector);
}
與此相同:
public IEnumerable<BookableResourceBooking> RetrieveBookingsForWorkOrder(
Guid workOrderId, Expression<Func<BookableResourceBooking, object>> selector)
{
return (IEnumerable<BookableResourceBooking>)
CrmServiceContext.BookableResourceBookingSet
.Where(x => x.msdyn_WorkOrder.Id == workOrderId)
.Select(selector);
}
所以 the.Select(selector)正在回傳 anIEnumerable<object>并且你試圖將它轉換為(IEnumerable<BookableResourceBooking>).
問題是為什么要selector這樣定義?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/515643.html
標籤:C#林克
上一篇:將物件串列的格式轉換為另一種
