首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在BLToolkit中映射代码表

在BLToolkit中映射代码表
EN

Stack Overflow用户
提问于 2011-12-22 04:49:02
回答 2查看 1.6K关注 0票数 1

在我的数据库中,有一个很大的" code“表,其中包含整个系统中使用的值的系统代码查找。如下所示:

代码语言:javascript
运行
复制
[TableName("code_entries")]                         public class Code {
    [MapField("code_nbr")][PrimaryKey, Identity]    public int Id;
    [MapField("code")]                              public string Value;
}

我是BLToolkit的新手,我希望有一个类似于我所见过的静态映射的概念,但这将允许我轻松地将这些代码在其他表中的出现映射到它们各自的值。例如:

代码语言:javascript
运行
复制
    [TableName("person")]                               public class Person {
        [MapField("person_nbr")][PrimaryKey, Identity]  public int Id;
        [MapField("dob")][Nullable]                     public int BirthDate;
        [MapField("eye_color")][Nullable]               public int EyeColorCode;
        [MapField("hair_color")][Nullable]              public int HairColorCode;    
}

如果上面的EyeColorCode和HairColorCode映射到Codes表中的值,我能否创建一种简单的方法来映射OR类中的数据,并在单个查询中获得整个对象?

我想以这样的方式结束:

代码语言:javascript
运行
复制
// person.Id = 1
// person.DOB = some date
// person.EyeColor = "Blue"
// person.HairColor = "Brown"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-23 01:02:19

这并不是您真正想要的,但是您可以使用Associations

因此您可以将此代码添加到Person类中

代码语言:javascript
运行
复制
[Association(ThisKey="eye_color", OtherKey="code_nbr", CanBeNull=true)]
public Code EyeColor;

[Association(ThisKey="hair_color", OtherKey="code_nbr", CanBeNull=true)]
public Code HairColor;

然后做一些像这样的事情

代码语言:javascript
运行
复制
from p in db.Person
select new
{
    Id        = p.Id,
    DOB       = p.BirthDate,
    EyeColor  = p.EyeColor.Value,
    HairColor = p.HairColor.Value
};

无论如何,这些看起来像是几乎永远不会改变的代码类型我通常在启动时将它们放在客户端上,然后在显示数据时填写描述,这样一切都变得容易得多,如果我找不到Id,我就会刷新集合

票数 1
EN

Stack Overflow用户

发布于 2012-03-13 00:58:58

谢谢大卫。我采用了你的方法,但稍微修改了一下,让我不那么痛苦。我在我的类中添加了关联,如您的示例所示:

代码语言:javascript
运行
复制
[Association(ThisKey = "EyeColorCode", OtherKey = "Id")]    public Code EyeColor { get; set; }
[Association(ThisKey = "HairColorCode", OtherKey = "Id")]   public Code HairColor { get; set; }

然后我写了一个扩展方法。它接受一个新对象,并将所有可写属性合并到源对象中。使用它,我不需要在查询中指定每个属性,例如:

代码语言:javascript
运行
复制
from p in db.Person
select p.PropertyUnion(new Person() {
{
    EyeColor  = p.EyeColor,
    HairColor = p.HairColor
};

这为我的一些更复杂的对象节省了相当多的代码,而且我认为它更具可读性。下面是扩展方法的代码:

代码语言:javascript
运行
复制
/// <summary>
/// Union by retrieving all non-null properties from source parameter and setting those properties on the instance object
/// </summary>
public static T PropertyUnion<T>(this T destination, T source) {
    // Don't copy from a null object
    if (Object.ReferenceEquals(source, null) || Object.ReferenceEquals(destination, null)) {
        return destination;
    }
    // copy properties
    foreach (var property in source.GetType().GetProperties()) {
        if (!property.CanWrite || !property.CanRead)
            continue;
        var match = destination.GetType().GetProperty(property.Name);
        if (!match.CanWrite || !match.CanRead)
            throw new MethodAccessException("Matching property '" + match.Name + "' must allow both read and write operations.");
        var value = property.GetValue(source, null);
        if (value != null && !value.Equals(Activator.CreateInstance(property.PropertyType)))
            match.SetValue(destination, value, null);
    }
    return destination;
}

再次感谢您的帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8596152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档