Как получить значение из IGrouping, где ключ и значение в объекте совпадают

У меня есть таблица базы данных с тремя столбцами: CodeType, Code, Name

Я храню значения в памяти, в кеш-памяти бедняков, если хотите, со значениями, назначенными для поиска.

      public class ShortCodeCache
{
    public DateTime LastRefresh { get; set; }

    public Lookup<string, ShortCode> CodeList { get; set; }
}

public class ShortCode
{
    public string CodeType { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
}

Я извлекаю значения из БД и назначаю их поисковому запросу.

      private static void GetShortCodeCache(DateTime current)
{
    try
    {
        using (SqlConnection cn = new MSSqlServerConnection().GetConnection())
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.CommandText = Query;
                cmd.Connection = cn;
                cn.Open();

                List<ShortCode> codesList = new List<ShortCode>();

                SqlDataReader readline = cmd.ExecuteReader();
                while (readline.Read())
                {
                    ShortCode shortCode = new ShortCode
                    {
                        CodeType = readline["CodeType"].ToString().Trim(),
                        Code = readline["Code"].ToString().Trim(),
                        Name = readline["Name"].ToString().Trim()
                    };

                    codesList.Add(shortCode);
                }

                currentCache.CodeList = (Lookup<string, ShortCode>)codesList.ToLookup(code => code.CodeType);

                if (currentCache.CodeList.Count != 0)
                    currentCache.LastRefresh = current;

                if (log.IsDebugEnabled)
                {
                    log.Debug("LastCacheRefresh: " + currentCache.LastRefresh);
                }
            }
        }
    }
    catch (SqlException sqlex)
    {
        log.Error(sqlex.Message);
        throw;
    }
    catch (Exception ex)
    {
        log.Error(ex.Message);
        throw;
    }
        
    return; 
}

Я считаю, что эта часть работает.

Моя проблема в том, что я не могу получить имя для определенного типа кода и кода. Например, я передаю DamageQuadrant и P9, и мне нужно значение Name.

Это то, что у меня есть сейчас, но VS лает на меня из-за отсутствия определения CodeType.

      public static string GetNameFromCode(string type, string code)
{
    CheckCodeCache();

    var codeType = currentCache.CodeList.Where(x => x.Key == type);
    string data = codeType.Where(x => x.CodeType, code).Name;

    return data;
}

Я пробовал другие способы, включая использование условия && в коде Linq. Похоже, это будет легко, но пока нет.

1 ответ

Решение

Во-первых: вы забываете добавить свой new ShortCodes к codesList, поэтому текущий код ничего не даст вам при поиске.

Во-вторых: используйте ILookup<> скорее, чем Lookup<>. У вас нет веских причин указывать тип реализации. Если вы ожидаете только один возможный элемент для каждой комбинации, используйте IDictionary<> вместо.

В-третьих: не используйте .Where()в справочнике или в словаре. Использовать [key] синтаксис вместо этого.

В-четвертых: введите в справочник или словарь значения, по которым вы хотите найти информацию.

      public IDictionary<(string Type, string Code), ShortCode> ShortCodesByTypeAndCode { get; set; }
      currentCache.ShortCodesByTypeAndCode = codesList.ToDictionary(code => (code.CodeType, code.Code));
      return currentCache.ShortCodesByTypeAndCode[(type, code)].Name;
Другие вопросы по тегам