我有一个问题,如果我使用LinqToSql,我的程序会将数据库加载到内存中。
举个例子:
//pageNumber = 1; pageSize = 100;
var result =
(
from a in db.Stats.AsEnumerable()
where (DictionaryFilter(a, sourceDictionary) && DateFilter(a, beginTime, endTime) && ErrorFilter(a, WarnLevel))
select a
);
var size = result.Count(); // size = 1007
var resultList = result.Skip((pageNumber-1)*pageSize).Take(pageSize).ToList();
return resultList;
DictionaryFilter、DateFilter 和 ErrorFilter 是用于过滤我的数据库的函数。使用这些函数后,我的程序会占用约250MB的内存。
如果我不使用这些函数:
var size = result.Count();
我的程序使用了大约120MB的内存。 在使用这段代码之前,我的程序只使用了大约35MB的内存。
如何使用count和take函数而不会将整个数据库加载到内存中?
static bool DateFilter(Stat table, DateTime begin, DateTime end)
{
if ((table.RecordTime >= begin.ToFileTime()) && (table.RecordTime <= end.ToFileTime()))
{
return true;
}
return false;
}
static bool ErrorFilter(Stat table, bool[] WarnLevel)
{
if (WarnLevel[table.WarnLevel]) return true;
else return false;
}
static bool DictionaryFilter(Stat table, Dictionary<GetSourcesNameResult, bool> sourceDictionary)
{
foreach (var word in sourceDictionary)
{
if (table.SourceName == word.Key.SourceName)
{
return word.Value;
}
}
//
return false;
}
AsEnumerable。看一下他的过滤器,它似乎由一堆自定义的内存谓词组成。他必须将所有过滤子句转换为Expression。编辑:没错。 - Wiktor ZychlaErrorFilter的实现等。 - Marc Gravell