IQueryable命令超时

时间:2013-04-11 10:58:55

标签: c# sql linq linq-to-sql iqueryable

我有一个问题。我正在使用Linq和IQueryable接口来处理我的数据库。 那是我的代码:

public static List<Stat> GetStateList(DataClassesDataContext db, int pageNumber,
    int pageSize, DateTime beginTime, DateTime endTime,
    Dictionary<GetSourcesNameResult, bool> sourceDictionary,
    bool[] WarnLevel, ref int count)
{
    IQueryable<Stat> result = db.Stats;

    result = DateFilter(result, beginTime, endTime);
    result = DictionaryFilter(result, sourceDictionary);
    result = ErrorFilter(result, WarnLevel);
    result = result.OrderBy(a => a.EventTime); //sort by eventTime

    count = result.Count();
    var resultList = result.Skip((pageNumber - 1) * pageSize)
                           .Take(pageSize).ToList();

    return new List<Stat>(resultList);
}

在我的数据库中有很多元素。如果我的过滤器给了我大约1mln元素。我有超时异常:

count = result.Count();

我需要做什么? Sql表达式:

SELECT [t0].[RecordId], [t0].[RecordTime], [t0].[EventGUID], 
       [t0].[AssociatedEventGUID], [t0].[EventId], [t0].[EventTime], 
       [t0].[WarnLevel], [t0].[UserType], [t0].[SourceId], 
       [t0].[FactoryNumber], [t0].[CntrlId], [t0].[CntrlFactoryNumber], 
       [t0].[ParamData], [t0].[TargetId], [t0].[SourceName], [t0].[TargetName]
FROM 
       [dbo].[Log] AS [t0]
WHERE 
   ((CONVERT(Int,[t0].[WarnLevel])) IN (@p0, @p1, @p2)) AND 
   ([t0].[SourceName] IN (@p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, 
   @p13, @p14, @p15, @p16, @p17, @p18, @p19, @p20, @p21, @p22, @p23, @p24, 
   @p25, @p26, @p27, @p28, @p29, @p30, @p31, @p32, @p33, @p34, @p35, @p36, 
   @p37, @p38, @p39, @p40, @p41, @p42, @p43, @p44, @p45, @p46, @p47, @p48, 
   @p49, @p50, @p51, @p52, @p53, @p54, @p55, @p56, @p57, @p58, @p59, @p60, 
   @p61, @p62, @p63, @p64, @p65, @p66, @p67, @p68, @p69, @p70, @p71, @p72, 
   @p73, @p74, @p75, @p76, @p77, @p78, @p79, @p80, @p81, @p82, @p83, @p84, 
   @p85, @p86, @p87, @p88, @p89, @p90, @p91, @p92, @p93, @p94, @p95, @p96, 
   @p97, @p98, @p99, @p100, @p101, @p102, @p103, @p104, @p105, @p106, @p107, 
   @p108, @p109, @p110, @p111, @p112, @p113, @p114, @p115, @p116, @p117, 
   @p118, @p119, @p120, @p121, @p122, @p123, @p124, @p125, @p126, @p127, 
   @p128, @p129, @p130, @p131, @p132, @p133, @p134, @p135, @p136, @p137, 
   @p138, @p139, @p140, @p141, @p142, @p143, @p144, @p145, @p146, @p147, 
   @p148, @p149, @p150, @p151, @p152, @p153, @p154, @p155, @p156, @p157, 
   @p158, @p159, @p160, @p161, @p162, @p163, @p164, @p165, @p166, @p167, 
   @p168, @p169, @p170, @p171, @p172, @p173, @p174, @p175, @p176, @p177, 
   @p178, @p179, @p180, @p181, @p182, @p183, @p184, @p185, @p186, @p187, 
   @p188, @p189, @p190, @p191, @p192, @p193, @p194, @p195, @p196, @p197, 
   @p198, @p199, @p200, @p201, @p202, @p203, @p204, @p205, @p206, @p207, 
   @p208, @p209, @p210, @p211, @p212, @p213, @p214, @p215, @p216)) 
  AND ([t0].[EventTime] >= @p217) AND ([t0].[EventTime] <= @p218)
    ORDER BY [t0].[EventTime]

1 个答案:

答案 0 :(得分:1)

您可以设置DataContext CommandTimeout属性

http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.commandtimeout.aspx

出于好奇,你为什么要

var resultList = result.Skip((pageNumber - 1) * pageSize)
                           .Take(pageSize).ToList();

    return new List<Stat>(resultList);

而不是

List<Stat> resultList = result.Skip((pageNumber - 1) * pageSize)
                           .Take(pageSize).ToList();

    return resultList ;