小编Lao*_*Lao的帖子

使用界面与具体地图的AutoMapper映射

我不认为这是可能的,但我想这是值得的.

我有以下类型共享一个接口(我保证,这不是我以前问过的同一个问题).

public interface ICustomer;

public class CustomerBO : ICustomer

public class CustomerSO : ICustomer // SO is Service Object in this case.
Run Code Online (Sandbox Code Playgroud)

然后,我有以下映射:

Mapper.Map<ICustomer, ICustomer>();
Run Code Online (Sandbox Code Playgroud)

现在,这里变得有趣/令人困惑.

这有效:

Mapper.Map<ICustomer, ICustomer>(customerSO, new CustomerBO);
Run Code Online (Sandbox Code Playgroud)

这不起作用:

Mapper.Map(customerSO, new CustomerBO());
Run Code Online (Sandbox Code Playgroud)

现在,通常我只是在键入第一个定义了两个接口类型的Map语句时就没有问题了,但我的问题是当Customer对象被隐藏在某个地方时.

public class CustomerOrderDTO
{
    ICustomer customer;
}

public class CustomerOrderSO
{
    CustomerSO customer;
}

Mapper.Map<CustomerOrderDTO, CustomerOrderSO>();
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为没有从ICustomer到CustomerSO的映射,因此配置断言失败.

目前,我正在解决这个问题:

Mapper.CreateMap<CustomerOrderDTO, CustomerOrderSO>()
    .ForMember(desc => dest.customer
        , exp => exp.MapFrom(src => Mapper.Map<ICustomer, ICustomer>(src.customer
            , new CustomerSO));
Run Code Online (Sandbox Code Playgroud)

但是,我必须为我们拥有的每个DTO类型的对象执行此操作,然后很可能具有级联效果.

据我所知,从技术上讲,我可以执行以下操作来解决此问题:

Mapper.Map<CustomerBO, CustomerSO>();
Run Code Online (Sandbox Code Playgroud)

但是,在CustomerBO中,业务逻辑中使用的许多其他属性不在接口中.同样,CustomerSO中有很多属性不在界面中.如果我使用上述路线,我会有大量的Ignore()调用,我必须将CustomerBO映射到CustomerSO,然后将CustomerSO映射到CustomerBO,每个都有自己唯一的Ignore调用列表.使用接口消除了对Ignore调用的需要,因为我希望在接口中定义从一个到另一个可见的数据.

所以,简而言之,我的问题是:有什么方法可以告诉AutoMapper在遇到其中一个实现类时使用接口映射?如果不这样做,是否有一些其他(读取:更好)的方式比MapFrom委托中的Map调用方式能够根据需要强制执行我的接口到接口映射?

c# interface automapper automapper-2

6
推荐指数
1
解决办法
3007
查看次数

Internet Explorer滞后于IQueryable数据源.Firefox和Chrome A-OK.提供视频证明

我想说这是查询,但事实并非如此.即使我们一步一步地完成它,查询也顺利完成.即使.DataBind()方法也不会导致延迟.

以下是我知道它与我的IQueryable作为绑定源的关系:

旧代码:

  1. 使用SqlCommand调用存储过程并使用SqlAdapter填充新的DataTable.
  2. DataTable将被发送到每个DropDownList的方法中.(有5个DDL)
  3. 每个方法都会将DataTable的行(是的,每个行)提供给IEnumerable.
  4. 将针对IEnumerable运行多个LINQ查询以过滤掉我们想要的选项,包括.Distinct(IEqualityComparer)和.Sort(x => x ["RowName"]); (同样,每种方法都会执行此操作).
  5. 将通过IEnumerable.CopyToDataTable()创建一个新的DataTable(是的,同样,每个方法)
  6. DropDownList.DataSource将设置为新的DataTable,然后设置为.DataBind().

对代码的这种可怕的歪曲将在IE中很快完成.也许是思考时间的第二或第二.

这是新的代码,在肉体中:

IQueryable<Expose_LotRuns> elr = DB.Expose_LotRuns;

if (iTechID > 0)
    elr = elr.Where(x => x.Master_LotRuns.Flows.CD_Techs.ID == iTechID);

if (iFlowID > 0)
    elr = elr.Where(x => x.Master_LotRuns.Flows.ID == iFlowID);

if (iToolID > 0)
    elr = elr.Where(x => x.Master_LotRuns.Tools.ID == iToolID);

if (iOperationID > 0)
    elr = elr.Where(x => x.Master_LotRuns.Operations.ID == iOperationID);

if (iReticleID > 0)
    elr = elr.Where(x => x.Reticles.ID == iReticleID);

var techs = from x in …
Run Code Online (Sandbox Code Playgroud)

c# firefox internet-explorer entity-framework google-chrome

3
推荐指数
1
解决办法
269
查看次数