Словарь поиска с целым числом, тип. Общий доступ и настройка типа ключа и значения - PullRequest
0 голосов
/ 20 декабря 2011

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 Ответ

1 голос
/ 20 декабря 2011

В моем понимании вы должны написать как одно свойство:

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;
   }
}
...