Mapster-动态特性选择或忽略



我有一个业务需要,只动态选择指定的给定模型的属性,类似于OData select子句。我目前正在使用Mapster的ProjectToType功能来填充EF Core实体中的视图模型。

有什么方法可以告诉Mapster在它生成的查询中只选择给定的属性列表吗?或者采用完整的模型映射,并在运行时更改TypeAdapterConfig实例中的映射,以忽略不在给定属性列表中的属性?

最终解决方案需要是通用的,并使用导航属性,因为它将应用于数据库中的所有实体。在某些情况下,我们也使用了DynamicLinq,不确定它是否可以用于Mapsters ProjectToType功能之上。

示例:

实体(某些属性因长度而省略(:

namespace DataAccess.Entities
{
public class Series
{
public Guid Id { get; set; }
public string Description { get; set; }
public long? StackRank { get; set; }
public string EntityId { get; set; }
// Other properties
}
public class Model
{
public Guid Id { get; set; }
public string Description { get; set; }
public string EntityId { get; set; }
public long? StackRank { get; set; }
public Guid SeriesId { get; set; }

public virtual Series Series { get; set; }

// Other properties
}
}

视图模型(某些属性因长度而省略(:

namespace Models
{
public class Model
{
public Guid Id { get; set; }
public string Description { get; set; }
public string EntityId { get; set; }
public long? StackRank { get; set; }
public Guid SeriesId { get; set; }

public virtual Series Series { get; set; }

// Other properties
}

public class Series
{
public Guid Id { get; set; }
public string Description { get; set; }
public long? StackRank { get; set; }
public string EntityId { get; set; }
// Other properties
}
}

给定一个rest调用来获取所有Model视图模型的列表,其中包括以下属性列表:

var properties = new List<string> {
"Id",
"EntityId"
"Description",
"Series.Id",
"Series.Description",
"Series.EntityId"
}

结果将返回某种类型的字典、动态或匿名对象,这些对象只包含这些属性,而其他属性甚至不会包含在创建的SQL查询的最终选择中。

最后,我决定使用Arca Artem的建议,并稍作改变。我使用反射来获取模型的所有属性的列表并缓存它们。之后,我将缓存的属性与要包含的属性列表进行了比较,并忽略了不在这两个列表中的属性。有点像这样:

var clonedConfig = mapsterInstance.Clone();
clonedConfig.ForType<TSource, TDestination>().Ignore(propertiesToIgnore);
var models = await query.ProjectToType<TDestination>(clonedConfig).ToListAsync();

也许不是最优雅的解决方案,但它足够好地满足我的需求。我还设置了json序列化程序来忽略null值。

相关内容

  • 没有找到相关文章

最新更新