Tag: mapping

在Dapper中映射实体

我刚刚开始使用Dapper,我似乎没有找到像将数据映射到数据库中的表一样简单的东西: 我有一个存储过程: CREATE PROCEDURE [dbo].GetUserById (@UserId int) AS begin SELECT UserId,LastName,FirstName,EmailAddress FROM users WHERE UserID = @UserId end go 然后是一个实体: public class User { public int Id { get; set; } public string LastName { get; set; } public string FirstName { get; set; } public string Email { get; set; } } 我的代码中有一个精巧的查询: int […]

为什么AutoMapper有一个看似更强大的ValueResolver时会有一个IValueFormatter?

它看起来像IValueFormatter获取type类型的值并返回string类型的值,而ValueResolver获取任何类型的值并返回任何类型的值。 所以,它更灵活。 还有一个问题是,使用ValueResolver ,您永远不需要将源转换为特定类型 – 您可以在类定义中明确定义它。 鉴于此,为什么要使用IValueFormatter ? 它是否可以执行ValueResolver无法完成的任何操作? 我误解了它是如何工作的吗?

在C#中将整数映射到RGB颜色

所以现在我有一个0到2 ^ 24之间的数字,我需要将它映射到三个RGB值。 我在如何实现这一点上遇到了一些麻烦。 任何帮助表示赞赏。

有条件地将一种源类型映射到两种目标类型

我有这样的源DTO public class Member { public string MemberId {get;set;} public string MemberType {get;set;} public string Name {get;set;} } 会员类型可以是“人”或“公司”。 还有两个这样的目的地类 public class PersonMember { public int PersonMemberId {get;set;} public string Name {get;set;} } public class CompanyMember { public int CompanyMemberId {get;set;} public string Name {get;set;} } 我想使用Automapper来检查MemberType在源类中的值,并根据该类型映射到两种目标类型之一。 我看到了有条件映射的例子,但它映射了它执行条件检查的字段。 我想检查条件并映射不同的字段。 var config = new MapperConfiguration(cfg => […]

递归映射ExpandoObject

在我的应用程序中,我必须使用ExpandoObject才能在运行时创建/删除属性; 但是,我必须将函数的返回的ExpandoObject映射到相应的对象/类。 所以我想出了一个小型Mapper来完成这项工作,但有3个问题: 它不会递归地映射ExpandoObject的内部对象。 当我尝试将int映射到Nullable时,它会抛出一个类型不匹配,因为我找不到一种方法来检测并正确地转换它。 字段无法映射public string Property; 。 码: I-实施: public static class Mapper where T : class { #region Properties private static readonly Dictionary PropertyMap; #endregion #region Ctor static Mapper() { PropertyMap = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).ToDictionary(p => p.Name.ToLower(), p => p); } #endregion #region Methods public static void Map(ExpandoObject source, T […]

如何配置Automapper以自动忽略具有ReadOnly属性的属性?

语境: 假设我有以下“目的地”类: public class Destination { public String WritableProperty { get; set; } public String ReadOnlyProperty { get; set; } } 和一个“source”类,其中一个属性具有ReadOnly属性: public class Source { public String WritableProperty { get; set; } [ReadOnly(true)] public String ReadOnlyProperty { get; set; } } 很明显,但要明确:我将以下列方式从Source类映射到Destination类: Mapper.Map(source, destination); 问题: 有哪些方法可以将Automapper配置为使用ReadOnly(true)属性自动忽略属性? 约束: 我使用Automapper的Profile类进行配置。 我不想弄脏具有Automapper特定属性的类。 我不想为每个只读属性配置Automapper,并且通过这种方式导致大量重复。 可能的(但不适合)解决方案: 1)将属性IgnoreMap添加到属性: [ReadOnly(true)] [IgnoreMap] […]

将一个对象映射到另一个对象的最佳实践

我的问题是,以最可维护的方式将一个对象映射到另一个对象的最佳方法是什么。 我无法改变我们获得的Dto对象设置为更规范化的方式,因此我需要创建一种方法将其映射到我们对象的实现。 以下示例代码显示了我需要发生的事情: class Program { static void Main(string[] args) { var dto = new Dto(); dto.Items = new object[] { 1.00m, true, “Three” }; dto.ItemsNames = new[] { “One”, “Two”, “Three” }; var model = GetModel(dto); Console.WriteLine(“One: {0}”, model.One); Console.WriteLine(“Two: {0}”, model.Two); Console.WriteLine(“Three: {0}”, model.Three); Console.ReadLine(); } private static Model GetModel(Dto dto) { var […]

如何在Automapper 6中映射期间忽略所有源成员的空值?

我一直在寻找各处:stackoverflow,automapper文档,互联网,只是找不到这方面的任何信息,即使这似乎是一个非常普遍的问题。 我的映射: CreateMap() .ForAllMembers(opt => opt.Condition(src => src != null)); 这不起作用,因为src表示源对象(StatusLevelDTO),而不是源属性(我认为)。 更具体地说,如果我将ObjectA映射到ObjectB,ObjectA.SomeValue为null而ObjectB.SomeValue为2,我希望目标对象保持其值(2)。 我已经看到了这个问题: Automapper使用自定义解析器跳过空值并尝试了前两个答案,但它们似乎都已过时版本6。 有没有办法在Automapper 6中实现这一点? 我准确地使用6.0.2。

使用CreateMap的实例版本和使用WCF服务映射?

与automapper有一些实际问题。 我想我找到了解决方案但不确定如何实现它。 基本上我使用ResolveUsing和ConstructedBy的自定义映射将params传递给构造函数,我知道大多数人在global.asax中设置了一次而忘记了它。 但问题是我的方法(在wcf上)将不同的参数传递给ResolveUsing的构造函数…… 在我使用静态方法的Mapper.CreateMap和Mapper.Map之前,看来当不同的请求通过方法(多用户)进入wcf服务时,它们彼此冲突。 看完之后,我可以使用CreateMap和Map的实例版本,这样每个请愿书都可以获得自己的地图并传入自己的参数。 但我似乎无法找到如何做到这一点。 谁能解释一下吗? 我真的被困了…… 在一次又一次之前,我会得到重复的键错误,并且我在构造函数上添加了一个日志跟踪,看起来1请求覆盖了另一个 – 因此是静态版本的Mapper。 好吧,我希望我是对的,但我找不到别的…… 编辑 – 我有什么例子 基本上所有映射都正常工作,因为我在大多数情况下使用MapFrom。 然后我创建一个我的Resolver实例,我在URL中传递。 在我传递之前我检查了url并且它是正确的。 但是一旦它返回它就会返回错误的URL。 我需要在URL中传递的原因是它有变量,所以我需要替换变量…基本上有两个url取决于办公室,我到处都有日志,我可以看到我传递的内容但是一次我把它传递进去 – 它不是我传入的那个,如果这是有道理的,这很奇怪! 它是一个WCF服务和一个客户端调用该方法两次通过2个不同的办公室,因此2个不同的URL。 但是它们总是返回相同的URL。 就好像一个会话正在覆盖另一个会话…… 我希望这是有道理的。 SalesPointResolver newSalesPointResolver = new SalesPointResolver(returnReservationUrl, reservationSite.ReservationUrl, startDate, endDate, officeCode); Mapper.CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) .ForMember(dest => dest.TaxIncluded, opt => opt.MapFrom(src => src.Segments.FirstOrDefault().TaxIncluded)) .ForMember(dest => […]

C#中2个纬度/经度点之间的方向

我有2个Lat Long格式的坐标。 我如何从A点(例如纽约37.149472,-95.509544)确定指向B点的方向(例如多伦多40.714269,-74.005973) 我正在寻找像“340 Degrees”这样的价值 在C#中