我想要一個將物體項轉換為 DTO 物件的運算式,并使用附加引數來選擇應將哪些資料復制到 DTO 中。在我添加引數之前,這非常有效:
private static readonly Expression<Func<User, UserDataGroupType, UserData>> s_entityToDataExpression = (User entity, UserDataGroupType dataGroups) => new UserData
{
Id = entity.Id,
State = entity.State,
Role = entity.Role.ToData(),
BaseData = dataGroups.HasFlag(UserDataGroupType.Base) ? entity.ToDataBase() : null,
BirthData = dataGroups.HasFlag(UserDataGroupType.Birth) ? entity.ToDataBirth() : null,
AddressData = dataGroups.HasFlag(UserDataGroupType.Address) ? entity.ToDataAddress() : null,
ExtendedData = dataGroups.HasFlag(UserDataGroupType.Extended) ? entity.ToDataExtended() : null,
};
private static readonly Func<User, UserDataGroupType, UserData> s_entityToDataDelegate = s_entityToDataExpression.Compile();
public static UserData ToData(this User entity, UserDataGroupType dataGroups) => s_entityToDataDelegate(entity, dataGroups);
public static IQueryable<UserData> ToData(this IQueryable<User> queryable, UserDataGroupType dataGroups) => queryable.Select(s_entityToDataExpression);
它在最后一行的引數處抱怨:
無法從“System.Linq.Expressions.Expression<System.Func<Entities.User, Enums.UserDataGroupType, UserData>>”轉換為“System.Linq.Expressions.Expression<System.Func<Entities.User, int, UserData>” >'
這個int來自哪里?UserDataGroupType 是位元組型別標志列舉。
更新
在@guru-stron 建議的修改之后,作業代碼如下所示:
private static Expression<Func<User, UserData>> GetToDataExpression(UserDataGroupType dataGroups) => (entity) => new UserData {...}
public static IQueryable<UserData> ToData(this IQueryable<User> queryable, UserDataGroupType dataGroups) => queryable.Select(GetToDataExpression(dataGroups));
uj5u.com熱心網友回復:
Queryable.Select有 2 個Func帶有一個和兩個引數的 's多載-
Select<TSource,TResult>(IQueryable<TSource>, Expression<Func<TSource,Int32,TResult>>)Select<TSource,TResult>(IQueryable<TSource>, Expression<Func<TSource,TResult>>)
第一個表示像 一樣的運算式.Select((item, index) => ...),您s_entityToDataExpression表示Func需要 2 個引數,因此編譯器嘗試將其強制轉換為Expression<System.Func<Entities.User, int, UserData>>,這是不可能的。
看起來您需要將代碼更改為以下內容:
private static Expression<Func<User, UserData>> GetExpression(UserDataGroupType dataGroups) => (User entity, UserDataGroupType ) => new UserData
{
Id = entity.Id,
State = entity.State,
Role = entity.Role.ToData(),
BaseData = dataGroups.HasFlag(UserDataGroupType.Base) ? entity.ToDataBase() : null,
BirthData = dataGroups.HasFlag(UserDataGroupType.Birth) ? entity.ToDataBirth() : null,
AddressData = dataGroups.HasFlag(UserDataGroupType.Address) ? entity.ToDataAddress() : null,
ExtendedData = dataGroups.HasFlag(UserDataGroupType.Extended) ? entity.ToDataExtended() : null,
};
public static IQueryable<UserData> ToData(this IQueryable<User> queryable, UserDataGroupType dataGroups)
=> queryable.Select(GetExpression(dataGroups));
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359185.html
