2013-01-05 73 views
0

我正在將一些代碼從ColdFusion遷移到.NET LinqToSQL。以下查詢目前嵌入到ColdFusion中。而不是試圖讓LinqToSQL這個,我正在考慮編寫一個存儲過程。注意:在這個上下文中的CF中的##實際上是SQL中的一個#。我不是創建一個全局臨時表將嵌入式SQL遷移到LinqToSql與存儲過程

<cfquery name="qryTrafficDetails"> 
    DECLARE @startDate date 
    DECLARE @endDate date 
    SET  @startDate = <cfqueryparam cfsqltype="CF_SQL_date" value="#filter.StartDate#"> 
    SET  @endDate = <cfqueryparam cfsqltype="CF_SQL_date" value="#filter.endDate#"> 


    SELECT CONVERT(date, CreateDate) AS CreateDate, url_vars.value('(search)[1]', 'nvarchar(max)') AS Item, remote_addr 
    INTO ##tempTraffic 
    FROM dbo.Traffic WITH (NOLOCK) 

    WHERE Createdate BETWEEN @startDate AND @endDate 
    AND  url_vars.exist('.[search]') = 1  


    SELECT Area, AreaSort, Item, CalendarDate, isNull(Visitor, 0) AS Visitor, ISNULL(Hit,0) AS Hit 
    FROM dbo.Calendar LEFT JOIN 
     (



     SELECT AreaSort = 10, 'Search' AS Area, FullGrid.Item AS Item, FullGrid.CalendarDate AS CreateDate, 

       COUNT(DISTINCT remote_addr) AS visitor, 
       COUNT(remote_addr) as hit 

     FROM (
      SELECT DISTINCT CalendarDate, Item 
      FROM dbo.Calendar, ##TempTraffic 
      WHERE CalendarDate BETWEEN @startDate AND @endDate 
      ) FullGrid 

     LEFT JOIN ##TempTraffic AS DataItem 
      ON FullGrid.CalendarDate = CreateDate 
      AND FullGrid.Item = DataItem.Item  

     GROUP BY FullGrid.Item, FullGrid.CalendarDate 



     ) AS SummaryDetail 

    ON CalendarDate = SummaryDetail.CreateDate 

    WHERE CalendarDate BETWEEN @startDate AND @endDate 
    AND AreaSort IS NOT NULL  

    ORDER BY AreaSort, Item, CalendarDate 
    </cfquery> 

    <cfreturn qryTrafficDetails> 

一些我關心的問題是:

  • 如何處理臨時表
  • 不LinqToSql面面俱到?
  • 這是LinqToSql不合適的例子嗎?
  • 性能

回答

1

我不能完全肯定你的SQL代碼的意圖和動機,但似乎是一個總結報告。在這種情況下,可能linq to sql不是理想的解決方案。

我不認爲你可以從linq 2 sql創建臨時表。您可以創建子查詢,也可以使用linq 2對象來加入先前執行的查詢的結果。

但我的建議是檢查是否沒有更好的方式來查詢您的數據使用更簡潔的查詢,也可以在linq 2 sql上執行。

如果你真的需要這種查詢,最好把它放在存儲過程中。