我有一个'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]
答案 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 };