Как получить значение из 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;