2009-05-19 16 views
2

我有一個類型爲'VARBINARY(max)'(存儲wav文件)'Wav'列的表,並希望能夠檢查是否有從Linq到SQL的wav。如何使Linq to SQL轉換爲派生列?

我的第一種方法是做Linq中執行以下操作:

var result = from row in dc.Table 
      select new { NoWav = row.Wav != null }; 

與上面的代碼將retreive所有的二進制內容到RAM中的問題,這是不好的(慢速和記憶餓)。

任何想法如何讓Linq查詢翻譯成SQL中的波紋管?

SELECT (CASE WHEN Wav IS NULL THEN 1 ELSE 0 END) As NoWav FROM [Update] 

回答

1

感謝所有的答覆。他們都有道理。實際上,Linq 應該正確地轉換!= null,但它似乎沒有有效地做到這一點:運行我的代碼非常緩慢,所以不知何故,我唯一的解釋是它將二進制數據傳輸到RAM中。 ..但也許我錯了。

我想我找到一個變通反正別的地方的計算器:Create a computed column on a datetime

我跑對我的桌子下面的查詢:

ALTER TABLE [Table] 
ADD WavIsNull AS (CASE WHEN [Wav] IS NULL Then (1) ELSE (0) END) 

現在我會更新我的DBML以反映計算列並看看它是如何發展的。哈哈!

+0

我的DBML中的'Wav'屬性設置爲延遲加載,這是否會解釋奇怪的行爲? – bounav 2009-05-20 13:22:50

0

您確定此代碼會將數據檢索到RAM嗎?

我沒有使用LINQPad和生成的SQL一些測試進行了優化,爲你的建議:

from c in Categories 
select new 
{ 
    Description = c.Description != null 
} 

SELECT 
    (CASE 
     WHEN [t0].[description] IS NOT NULL THEN 1 
     ELSE 0 
    END) AS [Description] 
FROM [Category] AS [t0] 
+0

哈!你擊敗了我! LINQPad真的是FTW – 2009-05-19 16:08:39

0

怎麼樣這個查詢:

var result = from row in dc.Table where row.Wav == null 
select row.PrimaryKey 

鑰匙的列表,你的價值空值。對於空的上市/未空,你可以這樣做:

var result = from row in db.Table 
      select new 
      { Key = row.Key, NoWav = (row.Wav == null ? true : false) }; 

,將產生類似這樣的SQL代碼:

SELECT [t0].[WavID] AS [Key], 
    (CASE 
     WHEN [t0].[Wav] IS NULL THEN 1 
     ELSE 0 
    END) AS [NoWav] 
FROM [tblWave] AS [t0] 
0

我不清楚這裏,你的SQL代碼將返回數據庫中的1和0列表。那是你在找什麼?如果你有一個ID爲您的記錄,那麼你可以只檢索與該領域的Wav的一個條件,即單個記錄,返回null就表示沒有WAV,即

var result = from row in dc.Table 
      where (row.ID == id) && (row.Wav != null) 
      select new { row.Wav };