2014-11-04 41 views
0

我試圖在linq裏寫條件的子查詢。但是當我在sql server profiler中查看我的sql語法時,我的查詢看起來很複雜且很長,並且在服務器中需要超時錯誤。如何在linq中寫入快速子查詢的條件

我想寫下面的查詢。

SELECT 
T1.Id, 
T2.Id, 
DATEADD(HOUR, 
    ISNULL(
    (
     SELECT 
      MAX(T3.MaxHour) AS [MaxHour] 
     FROM TABLE3 T3 WITH(NOLOCK) 
     WHERE 
      T1.CategoryId=T3.CategoryId 
    ), 
    0),T1.EndDate 
    ), 
T1.StartDate 
FROM 
    TABLE1 T1 WITH(NOLOCK)  
LEFT OUTER JOIN TABLE2 T2 WITH(NOLOCK) ON T1.Id=T2.Id 
WHERE 
    DATEADD(HOUR, 
    ISNULL(
    (
     SELECT 
      MAX(T3.MaxHour) AS [MaxHour] 
     FROM TABLE3 T3 WITH(NOLOCK) 
     WHERE 
      T1.CategoryId=T3.CategoryId 
    ), 
    0),T1.EndDate 
    ) 
    > '2014-11-05 00:00:00' 
AND 
    T1.StartDate < '2014-11-05 06:00:00' 

ı寫了我的linq表達式這樣。

 var actualData = from T1 in _context.TABLE1 
         join T2 in _context.TABLE2 on T1.Id equals T2.Id into data 
         from x in data.DefaultIfEmpty() 
         where 
          EntityFunctions.AddHours(T1.EndDate, 
          (
           (int?)((from T3 in _context.TABLE3 
             where 
              T3.CategoryId == T1.CategoryId 
             select 
              T3).Max(row => row.MaxHour)) 
          ) ?? 0 
          ) >= '2014-11-05 00:00:00' 
          && T1.StartDate < '2014-11-05 06:00:00' 

         select 
          new 
          { 
           Id1 = T1.Id, 
           Id2 = T2.Id, 
           StartDate = T1.StartDate, 
           EndDate = EntityFunctions.AddHours(T1.EndDate, 
            (
             (int?)((from T3 in _context.TABLE3 
             where 
              T3.CategoryId == T1.CategoryId 
             select 
              T3).Max(row => row.MaxHour)) 
            ) ?? 0 
           ) 

          }; 

但它似乎不在sql中,我想看到。

我該怎麼寫linq?

謝謝。

+0

也許這將有助於http://stackoverflow.com/questions/1220807/ nolock-with-linq-to-sql – juharr 2014-11-04 13:44:41

+0

謝謝,但我的問題不是nolock表達式。 我的問題是在哪裏條件的子查詢。 Linq表達式在sql查詢中變得混亂,並且它有一個錯誤超時。我想在我的問題sql中看到我在sql server配置文件中的linq語法。 – 2014-11-04 14:43:51

回答

0

嘗試:

var actualData = from T1 in _context.TABLE1 
        join T2 in _context.TABLE2 on T1.Id equals T2.Id into data 
        from x in data.DefaultIfEmpty() 

        let endate = EntityFunctions.AddHours(T1.EndDate, 
         (
          (
           from T3 in _context.TABLE3 
           where T3.CategoryId == T1.CategoryId 
           select T3).Max(row => row.MaxHour) 
          ) 
         ) ?? 0 
        ) 

        where 
         enddate >= '2014-11-05 00:00:00' 
         && T1.StartDate < '2014-11-05 06:00:00' 

        select 
         new 
         { 
          Id1 = T1.Id, 
          Id2 = T2.Id, 
          StartDate = T1.StartDate, 
          EndDate = enddate 
         }; 

而且我懷疑你可以在默認情況下返回劇組下降到(int?),因爲max(int)int?