2013-04-11 288 views
4

我有一個問題。我正在使用Linq和IQueryable接口來處理我的數據庫。 這是我的代碼: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); 
} 

我的數據庫中大量的元素。如果我的過濾器給我約100萬個元素。我有超時異常在這:

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

您應該看看linq語句生成的SQL。 – Magnus 2013-04-11 11:12:47

+0

@Magnus:增加了sql命令。 – EXTRAM 2013-04-11 11:23:25

+2

我懷疑'count'查詢會產生這種情況,但無論如何,您應該運行查詢並檢查執行計劃。也許你需要一些表格的索引。 – Magnus 2013-04-11 12:01:48

回答

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 ; 
+0

謝謝。這非常有幫助! – EXTRAM 2013-04-12 11:19:02