3

問題が 1 つあります。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のRAMを使用します。私が使用しない場合:

var size = result.Count(); 

私のプログラムは ~120MB の RAM を使用します。このコードを使用する前に、私のプログラムは ~35MB の RAM を使用します。

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

2 に答える 2

1

次のSOの質問は物事を説明するかもしれません:Linq To Sqlで.AsEnumerableを理解する

.AsEnumerable() はテーブル全体をロードします。

于 2013-04-03T12:10:11.063 に答える