0

尝试将 CheckBoxList 中的选择保存为stringDB 中的逗号分隔列表 ( )(选择了一个或多个选项)。我正在使用代理以另存为,string因为否则我必须在数据库中为关系创建单独的表 - 对于这个简单的场景,这项工作不值得,我希望我可以将它转换为string并避免这种情况。

CheckBoxList 使用enum它的选择:

public enum Selection 
{ 
    Selection1,
    Selection2,
    Selection3
}

不要复杂,但我使用[Display(Name="Choice 1")]和一个扩展类在 UI 上显示一些友好的东西。不知道我是否可以保存它string而不仅仅是enum,虽然我认为如果我保存enum它对我来说在某些确认页面上的 UI 上“显示”友好字符串并不是什么大不了的事。

这是在数据库中保存 a 的“记录”类string

public virtual string MyCheckBox { get; set; }

这是“代理”,这是我找到但不直接处理的一些示例enum,它使用IEnumerable<string>(或者应该是IEnumerable<Selection>?):

public IEnumerable<string> MyCheckBox
{
    get
    {
        if (String.IsNullOrWhiteSpace(Record.MyCheckBox)) return new string[] { };
            return Record
                .MyCheckBox
                .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                .Select(r => r.Trim())
                .Where(r => !String.IsNullOrEmpty(r));
    }
    set
    { 
        Record.MyCheckBox = value == null ? null : String.Join(",", value); 
    }
}

为了保存在数据库中,我尝试在创建类中执行此操作:

proxy.MyCheckBox = record.MyCheckBox; //getting error here

但我得到了错误:

无法将“字符串”隐式转换为 System.Collections.Generic.IEnumerable'

我不知道是否可以或更好地使用ParseToString从 API 获取枚举值。

我知道做这样的事情会将我放入("")数据库中的任何内容存储起来,所以只需弄清楚如何克服错误(或者,如果有替代方法):

proxy.MyCheckBox = new[] {"foo", "bar"};

我对这些东西不擅长,只是一直在挖掘和挖掘以提出解决方案。任何帮助深表感谢。

4

1 回答 1

0

您可以使用自定义用户类型来完成此操作。下面的示例在ISet<string>类上使用 an 并将值存储为分隔字符串。

[Serializable]
public class CommaDelimitedSet : IUserType
{
    const string delimiter = ",";

    #region IUserType Members

    public new bool Equals(object x, object y)
    {
        if (ReferenceEquals(x, y))
        {
            return true;
        }
        var xSet = x as ISet<string>;
        var ySet = y as ISet<string>;
        if (xSet == null || ySet == null)
        {
            return false;
        }
        // compare set contents
        return xSet.Except(ySet).Count() == 0 && ySet.Except(xSet).Count() == 0;
    }

    public int GetHashCode(object x)
    {
        return x.GetHashCode();
    }

    public object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        var outValue = NHibernateUtil.String.NullSafeGet(rs, names[0]) as string;
        if (string.IsNullOrEmpty(outValue))
        {
            return new HashSet<string>();
        }
        else
        {
            var splitArray = outValue.Split(new[] {Delimiter}, StringSplitOptions.RemoveEmptyEntries);
            return new HashSet<string>(splitArray);
        }
    }

    public void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        var inValue = value as ISet<string>;
        object setValue = inValue == null ? null : string.Join(Delimiter, inValue);
        NHibernateUtil.String.NullSafeSet(cmd, setValue, index);
    }

    public object DeepCopy(object value)
    {
        // return new ISet so that Equals can work
        // see http://www.mail-archive.com/nhusers@googlegroups.com/msg11054.html
        var set = value as ISet<string>;
        if (set == null)
        {
            return null;
        }
        return new HashSet<string>(set);
    }

    public object Replace(object original, object target, object owner)
    {
        return original;
    }

    public object Assemble(object cached, object owner)
    {
        return DeepCopy(cached);
    }

    public object Disassemble(object value)
    {
        return DeepCopy(value);
    }

    public SqlType[] SqlTypes
    {
        get { return new[] {new SqlType(DbType.String)}; }
    }

    public Type ReturnedType
    {
        get { return typeof(ISet<string>); }
    }

    public bool IsMutable
    {
        get { return false; }
    }

    #endregion
}

映射文件中的用法:

Map(x => x.CheckboxValues.CustomType<CommaDelimitedSet>();
于 2013-03-05T16:22:35.313 回答