所以我有一个来自数据库的列表,我正在使用linq查找项目,这是我的工作方式:
public static List<myEntity> GetEntities()
{
List<myEntity> result = new List<myEntity>();
var entities = _data.AsEnumerable()
.Where(ent => ent.Field<string>(Constants.MODEL_DESC).Split(';')[0] == Constants.MODEL_ENTITY);
foreach (var entity in entities)
{
myEntitytemp = new myEntity();
string[] zzzDESC = entity.Field<string>(Constants.MODEL_DESC).Split(';');
temp.ID = Convert.ToInt16(zzzDESC[1]);
temp.icon = zzzDESC[2].Replace(".bmp", "");
temp.Translations = GetTranslation(Convert.ToInt16(zzzDESC[1]));
temp.tableName = GetTableName(temp.ID);
temp.attributes = GetAttributes(temp.ID);
result.Add(temp);
}
return result;
}
所以基本上我的表中有3列,其中1列存储由“;”分隔的有用数据。在这个函数里面,我有GetTableName
(返回一个字符串)和GetAttributes
(返回类属性列表)和GetTranslations()
,其中我使用的是与此方法相同的逻辑GetEntities()
。
private static List<Translation> GetTranslation(int id)
{
List<Translation> result = new List<Translation>();
var translations = _data.AsEnumerable()
.Where(trl => trl.Field<string>(Constants.MODEL_DESC).Split(';')[0] == Constants.MODEL_TRANSLATION)
.Where(trl => trl.Field<string>(Constants.MODEL_DESC).Split(';')[2] == id.ToString());
foreach(var trl in translations)
{
Translation temp = new Translation();
string[] ZZZDesc = trl.Field<string>(Constants.MODEL_DESC).Split(';');
temp.ID = Convert.ToInt16(ZZZDesc[1]);
temp.ParentID = Convert.ToInt16(ZZZDesc[2]);
temp.Language = (Language)Convert.ToInt16(ZZZDesc[3]);
temp.ShortName = ZZZDesc[4];
temp.LongName = ZZZDesc[5];
temp.HelpID = ZZZDesc[6];
temp.Description = ZZZDesc[7];
result.Add(temp);
}
return result;
}
他们都查询相同的数据,在这种情况下是_data
。这是一个DataTable。我已经注意到这个过程很长。很确定这是因为我必须一遍又一遍地查询同一个表以找到我正在搜索的内容。该表本身有大约8000行,所以它没那么多。
我想我可能会删除行,一旦我得到了我的东西,我不知道这是一个好主意,因为我将不得不找到我正在使用的行,以便在每个函数的_data中再多进1次然后删除它。 或者如果可能的话,可以使用linq吗?并在我构建var entities
,var translations
等的同时进行此操作。
或者仅仅是我使用linq的方式是问题吗?
答案 0 :(得分:0)
IEnumberable使用延迟加载。将其放在第一次调用的列表中,它可能会加快进程。
如果您正在阅读Lot表,您可能希望将其放在缓存中。