你可以用IUserType做到這一點,像這樣:
public class DelimitedList : IUserType
{
private const string delimiter = "|";
public new bool Equals(object x, object y)
{
return object.Equals(x, y);
}
public int GetHashCode(object x)
{
return x.GetHashCode();
}
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var r = rs[names[0]];
return r == DBNull.Value
? new List<string>()
: ((string)r).SplitAndTrim(new [] { delimiter });
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
object paramVal = DBNull.Value;
if (value != null)
{
paramVal = ((IEnumerable<string>)value).Join(delimiter);
}
var parameter = (IDataParameter)cmd.Parameters[index];
parameter.Value = paramVal;
}
public object DeepCopy(object value)
{
return value;
}
public object Replace(object original, object target, object owner)
{
return original;
}
public object Assemble(object cached, object owner)
{
return cached;
}
public object Disassemble(object value)
{
return value;
}
public SqlType[] SqlTypes
{
get { return new SqlType[] { new StringSqlType() }; }
}
public Type ReturnedType
{
get { return typeof(IList<string>); }
}
public bool IsMutable
{
get { return false; }
}
}
然後定義的IList <串>財產type =「MyApp.DelimitedList,MyApp」。
注意:SplitAndTrim是一個字符串擴展,帶有我創建的各種覆蓋。這裏是核心方法:
public static IList<string> SplitAndTrim(this string s, StringSplitOptions options, params string[] delimiters)
{
if (s == null)
{
return null;
}
var query = s.Split(delimiters, StringSplitOptions.None).Select(x => x.Trim());
if (options == StringSplitOptions.RemoveEmptyEntries)
{
query = query.Where(x => x.Trim() != string.Empty);
}
return query.ToList();
}
*我的看法,從我的經驗... *我不會這樣。因爲後來,如果你的應用程序會成功,用戶將會問你使用'Attachments'中的值進行搜索的功能......這將是非常困難的。我確實在各處都使用實體。即'附件'帶有1)ID和2)字符串說明... 3)並返回給持有人。這種方式變得更復雜一些(IList),但它可以用於搜索(子查詢)。無論如何,如果你想使用'IList '分開的表格仍然是最好的選擇,我會說。 –
2014-11-01 06:33:46
@RadimKöhler我的問題純粹是爲列表,並與列表無關...不會用戶類型更好? –
harishr
2014-11-01 16:01:46
如果我有答案,我會把它給你。我的觀點是,1)'IList'應該存儲在單獨的表中。該表將保存對根實體(Holder_ID列)的引用和字符串值(值列)。 2)如果我們已經在那裏,我會建議更進一步。我會用它自己的替代關鍵字來擴展表格,並將其視爲一個「附件」或「文件」實體......但保留字符串列表...我沒有看到任何優勢...不知道這是否有幫助。 .. –
2014-11-01 16:04:38