2009-05-19 14 views
2

Ich habe eine Tabelle mit einer "WAV" -Spalte vom Typ "VARBINARY (max)" (speichert eine WAV-Datei) und würde gerne überprüfen können, ob es eine WAV von LINQ nach SQL gibt.Wie man Linq zu SQL in eine abgeleitete Spalte übersetzt?

Mein erster Ansatz war die folgende in Linq zu tun:

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

Das Problem mit dem Code oben ist, wird es die ganze binäre Inhalt retreive auf RAM, und das ist nicht gut (langsam und Speicher hungrig).

Haben Sie eine Idee, wie Linq Query in etwas wie Balg in SQL zu übersetzen?

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

Antwort

1

Danke für alle Antworten. Sie ergeben alle Sinn. In der Tat sollte Linq die! = Null richtig übersetzen, aber es schien nicht effektiv es zu tun: Laufen mein Code war sehr langsam, so irgendwie meine einzige Erklärung ist, dass es die binären Daten in den RAM übertragen. .. aber vielleicht liege ich falsch.

Ich glaube, ich eine Arbeit um ohnehin woanders auf Stackoverflow gefunden: Create a computed column on a datetime

ich die folgende Abfrage für meinen Tisch lief:

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

Jetzt werde ich meine DBML aktualisieren, um diese berechnete Spalte widerspiegeln und sehen, wie es geht.

+0

Die "Wav" -Eigenschaft in meinem DBML ist so eingestellt, dass das Laden verzögert wird, würde dies das seltsame Verhalten erklären? – bounav

+0

Durchlaufen Sie Ihre Anweisung in einem Debugger und verfolgen Sie die tatsächlichen ausgegebenen SQL-Anweisungen. Nur so kannst du deine Frage definitiv beantworten :) Die untenstehenden Antworten von bruno und ich weisen darauf hin, dass es dein BLOB nicht bringt. Der Grund, warum es langsam ist, mag nichts damit zu tun haben, dass Binärdaten in den RAM übertragen werden - fügen Sie einige Trace- und Stoppuhranweisungen hinzu, um die langsamen Teile zu finden, und sql profiler, um die Abfragen zu finden –

0

Sind Sie sicher, dass dieser Code die Daten im RAM abrufen wird?

ich einige Tests haben mit LINQPad und die generierten SQL optimiert wurde, wie Sie vorschlagen:

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! Du warst schneller als ich! LINQPad ist wirklich FTW –

0

Was diese Anfrage:

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

für eine Liste von Schlüsseln, wo Ihr Wert ist Null. Für die Listung null/nicht null Sie dies tun könnte:

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

Das SQL-Code ähnlich wie diese erzeugen:

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

Ich bin hier nicht klar, SQL-Code ein zurückkehren wird Liste von 1s und 0s aus Ihrer Datenbank. Ist das wonach Sie suchen? Wenn Sie eine ID für Ihre Aufzeichnung haben, dann können Sie abrufen nur, dass einzelnen Datensatz mit der Bedingung auf dem Wav Feld, würde null Rückkehr keine wav zeigen, das heißt

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