使用整数、类型查找字典.泛型键和值类型的访问和设置
本文关键字:类型 键和值 访问 设置 泛型 字典 整数 查找 | 更新日期: 2023-09-27 18:18:20
CSLA . net是我们公司在大多数项目中大量使用的框架,因此其中一些约束是框架本身强制的,不能更改。我将尽力指出这些限制条件。
我有一组大约50个类,它们都是相似的,因为它们基本上是一个字典(包装在CSLA类型中),它提供了一个查找的单例实例,以便在程序的各个地方使用。
类的结构大致如下
public class SomeLookup : Csla.NameValueListBase<Integer, SomeLookupPair>
{
private static SomeLookup _list
private SomeLookup
{
//DataPortal.Fetch Calls the DataPortal_Fetch and returns the <T>
if (_list != null) { _list = DataPortal.Fetch<SomeLookup>; }
}
public static SomeLookup GetSomeLookup(Object criteria)
{
return new SomeLookup;
}
public override void DataPortal_Fetch(Object criteria)
{
using(SqlClient.SqlConnection cn = new SqlClient.SqlConnection(ConnectionString))
{
cn.Open();
using(SqlClient.SqlCommand = new SqlClient.SqlCommand)
{
cm.Connection = cn;
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "getSomeLookup"
using(var dr = new Csla.Data.SafeDataReader(cm.ExecuteReader)
{
while(dr.Read)
{
//populates the interal nameValueList with lookup key/value pairs
Add(new NameValuePair(dr.GetInt32("Id"),
new SomeLookupPair { Code = dr.GetString("code"),
Description = dr.GetString("Description") });
}
}
}
}
}
}
public class SomeLookupPair
{
public string Code {get; set;}
public string Description {getl set;}
}
例如,用于查找的表类似于
Table SomeLookUp
ID int PK
Code varchar(2)
Description varchar(50)
一个对象引用这个查询的值将在数据库中建模只存储ID字段所以
Table SomeObject
ID int PK
SomeLookupId int FK
.....
但是在类中,我想只显示描述或代码(用户的描述,内部/业务使用的代码)
我的问题是处理这种情况下,我的类需要访问对象如下
private integer _someLookupID { get { //retrived from database and stored }; set { _someLookupId = value; }
public SomeLookupPair _someLookupPair { get { (SomeLookUp.GetSomeLookup)[_someLookupID] }; }
public void setSomeLookupID(SomeLookupPair pair)
{
_someLookupId = (SomeLookup.GetSomeLookUp).Where(s => s.Value(pair)).Select(s => s.Key).SingleOrDefault
}
感觉有一个更好的方法来处理SomeLookupID
的值设置,我可以直接做
在我的理解中,你应该把它写成一个单独的属性:
public SomeLookupPair SomeLookupPair
{
get
{
(SomeLookUp.GetSomeLookup)[_someLookupID] };
}
set
{
_someLookupId = (SomeLookup.GetSomeLookUp).Where(s => s.Value(value)).Select(s => s.Key).SingleOrDefault;
}
}
如果你想获得更高的性能(实际上现在你循环遍历所有的值),你可以重构SomeLookupPair并包括ID(我认为它是为你的查找设计的,因为现在你不使用高性能的访问键!!)。像这样,你可以直接在setter
中访问选定的idpublic SomeLookupPair SomeLookupPair
{
get
{
(SomeLookUp.GetSomeLookup)[_someLookupID] };
}
set
{
if(value == null) throw new ArgumentNullException();
_someLookupId = value.ID;
}
}