【问题标题】:Use enum parameter with c# expression将枚举参数与 c# 表达式一起使用
【发布时间】:2021-12-24 21:22:09
【问题描述】:

我想要一个将实体项转换为 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.Linq.Expressions.Expression>'

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));

【问题讨论】:

    标签: c# entity-framework linq asp.net-core .net-core


    【解决方案1】:

    Queryable.Select 有 2 个重载,Func 有一个和两个参数 -

    • Select&lt;TSource,TResult&gt;(IQueryable&lt;TSource&gt;, Expression&lt;Func&lt;TSource,Int32,TResult&gt;&gt;)
    • Select&lt;TSource,TResult&gt;(IQueryable&lt;TSource&gt;, Expression&lt;Func&lt;TSource,TResult&gt;&gt;)

    第一个表示.Select((item, index) =&gt; ...) 之类的表达式,您的s_entityToDataExpression 表示需要2 个参数的Func,因此编译器尝试将其转换为Expression&lt;System.Func&lt;Entities.User, int, UserData&gt;&gt;,这是不可能的。

    看来您需要将代码更改为:

    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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2020-09-11
      • 2017-11-01
      相关资源
      最近更新 更多