将Dto映射到实体以获取DataGrid消耗

时间:2013-05-07 04:17:04

标签: c# wpf mvvm wpfdatagrid dto

我正在编写一个WPF MVVM应用程序,并且有一个关于从Database Dto对象映射到Model实体的问题。

首先,我没有在这个项目中使用ORM(EF或NH等) - 所以只有一个Oracle Repository包含返回Dto Collections的方法,即

private IList<MyDataDto> LoadData(){
...
}

MyDataDto可能如下所示:

public class MyDataDto
{
    public DateTime? MyDate { get; set; }

    public string Identifier { get; set; }

    public decimal? Value { get; set; }
}

MyDataEntity可能如下所示:

public class MyDataEntity
{
    public DateTime? MyDate { get; set; }

    public decimal? Toyota { get; set; }

    public decimal? Honda { get; set; }

    public decimal? Nissan { get; set; }

    public decimal? Mazda { get; set; } 
}

和我的模特一样:

public class MyModel : INotifyPropertyChanged
{
    private IEnumerable<MyDataEntity> modelData;
    public IEnumerable<MyDataEntity> ModelData
    {
        get { return modelData; }
        set
        {
            modelData= value;
            OnPropertyChanged("ModelData");
        }
    }

    //other stuff in here but not shown for brevity
}

我有一个Quartz调度程序正在运行,在该作业中它查询数据库并且自定义映射器将Dto集合映射到Entity集合,然后将Entity集合分配给继承自INotifyPropertyChanged接口的Model,以便更改反映在我的用户界面。

MyDataDto中的每个Identifier值等于MyDataEntity中的Property。因此,如果有效的Identifer值是Toyota,则MyDataEntity中的列名称将是Toyota。这些标识符已在查询where子句中指定(它们必须是),因此我知道将检索哪些标识符,并且这些标识符不太可能发生变化(极不可能!)

所以,我的问题是,是否可以拥有像我所示的丑陋实体(将Identifers作为列名),以便映射到数据网格很容易,或者是否有更好的,更优选的方式?

1 个答案:

答案 0 :(得分:0)

这就是我最终做的事情:

public class MyDataEntity
{
    public DateTime? MyDate { get; set; }

    public IDictionary<Identifier, decimal?> IdentifierType { get; set; } 
}

public enum Identifer
{
    Toyota,
    Honda,
    Nissan,
    Mazda
}

和我的xaml:

<TextBlock Text="{Binding IdentifierType[Toyota]}" />

我的mapper处理从dto到模型实体的转换,结果使我的模型更加整洁,并且工作得非常漂亮!

希望这有助于其他xaml / wpf noobs