Словарь поиска с целым числом, тип. Общий доступ и настройка типа ключа и значения
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)
Таким образом, объект, ссылающийся на значение из этого поиска, будет смоделирован в базе данных с сохранением только поля идентификатора, поэтому
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
где я могу сделать это напрямую
1 ответ
В моем понимании вы должны написать как одно свойство:
public SomeLookupPair SomeLookupPair
{
get
{
(SomeLookUp.GetSomeLookup)[_someLookupID] };
}
set
{
_someLookupId = (SomeLookup.GetSomeLookUp).Where(s => s.Value(value)).Select(s => s.Key).SingleOrDefault;
}
}
Я хочу получить более высокую производительность (на самом деле теперь вы перебираете все значения), вы можете реорганизовать SomeLookupPair и включить ID (я думаю, что он предназначен для этого вашего Lookup, потому что теперь вы не используете доступ к производителю через ключ!!!), Как будто вы получаете доступ к выбранному идентификатору прямо в сеттере
public SomeLookupPair SomeLookupPair
{
get
{
(SomeLookUp.GetSomeLookup)[_someLookupID] };
}
set
{
if(value == null) throw new ArgumentNullException();
_someLookupId = value.ID;
}
}