2009-05-19 10 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 }; 

上記のコードの問題は、それがRAMにすべてのバイナリコンテンツを盗んだろうし、これは(良い遅く、メモリ空腹ではありません)。

LinqクエリをSQLのようなものに変換する方法はありますか?

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

答えて

1

おかげで何のwavファイルを示さないだろう。彼らはすべて意味をなさない。確かに、Linq になるはずです!!= nullを正しく翻訳しますが、それを効果的にやっていないようです:私のコードを実行するのが非常に遅かったので、何とか私の唯一の説明はバイナリデータをRAMに転送しました。 ..しかし多分私は間違っています。

私はstackoverflowの上、とにかくどこかの周りの仕事を見つけたと思う: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

+0

デバッガで文をステップ実行し、実際に発行されたSQL文をトレースします。それはあなたがあなたの質問に決定的に答える唯一の方法です:) brunoからの回答と私はそれがあなたのBLOBを持ち込まないことを提案します。それが遅い理由はバイナリデータがRAMに転送されることとは関係がないかもしれません - 遅い部分を見つけるためにいくつかのトレースとストップウォッチステートメントを追加し、クエリを見つけるためにSQLプロファイラ –

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

Ha!あなたは私にそれを打つ! LINQPadは本当にFTWです –

0

このクエリについて何:あなたの値は、キーのリストについては、

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

をヌル。ヌル/ NOT NULLのリストについては、あなたがこれを行うことができます。このようなSQLコードが生成されます

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

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フィールド上の条件でその単一のレコードを取得することができ、ヌルリターンは、すべての返信用すなわち

var result = from row in dc.Table 
      where (row.ID == id) && (row.Wav != null) 
      select new { row.Wav }; 
関連する問題