如何使Linq to SQL转换为派生列?

时间:2009-05-19 15:47:45

标签: sql linq-to-sql

我有一个'Wav'列的表,其类型为'VARBINARY(max)'(存储wav文件),并且希望能够检查是否存在从Linq到SQL的wav。

我的第一个方法是在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]

4 个答案:

答案 0 :(得分: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以反映该计算列,看看它是如何进行的。

答案 1 :(得分: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]

答案 2 :(得分:0)

这个查询怎么样:

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

表示值为null的键列表。对于null / not null的列表,您可以这样做:

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]

答案 3 :(得分:0)

我在这里不清楚,你的SQL代码将从你的数据库中返回1和0的列表。那是你在找什么?如果你的记录有一个ID,那么你可以用Wav字段中的a条件检索那条单个记录,null return表示没有wav,即

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