我有一张图片的varbinary(max)
列表格。我已经将表放在LinqToSql设计器上并将“Delay load”设置为true,因为我不想加载实际的图像数据。
是否可以只知道列是否为空,而不是获取实际数据并仍然只从数据库中执行一个查询?
我还想使用Linq创建的自动化实体。
像新bool HasImage {get;}
属性这样的东西就是我正在寻找的东西。
答案 0 :(得分:3)
创建部分类
public partial class MyTableObject
{
public bool HasImage { get { return MyColumn.HasValue; } }
}
这可能会触发数据库命中,但
我建议在上传或删除图片时设置的数据库“HasImage”位添加一个新列
答案 1 :(得分:3)
Linq to SQL“自动”知道列是否具有值的唯一方法是实际向数据库询问它。您可以使用fields / properties扩展partial类,但这不会消除查找。
您可以做的一件事是创建一个计算列(假设SQL 2005+在这里,否则您将不得不尝试将其适应您的DBMS)。如果您的表格如下所示,例如:
CREATE TABLE Foo
(
FooID int NOT NULL IDENTITY(1, 1) PRIMARY KEY,
FooName varchar(50) NOT NULL,
FooImage varbinary(max) NULL
)
您可以这样添加计算列:
ALTER TABLE Foo
ADD FooHasImage AS CASE
WHEN FooImage IS NULL THEN 0
ELSE 1
END
然后,您可以将FooHasImage
列添加到Linq to SQL实体,不延迟加载它,并检查该属性而不是显式检查FooImage
属性
另外,我觉得有必要指出以这种方式将图像存储在数据库中是次优的。可能有必要,我对您的环境了解不多,但如果您使用的是SQL Server 2008,请考虑使用FILESTREAM
代替,因为它将使用文件系统进行廉价的“离线”BLOB存储而不是将整个事物塞进数据库中。
答案 2 :(得分:0)
不知道你的Q的实际答案,但是如果你没有得到答案:如何在DB中自己进行更改。 (当然,如果您可以控制数据库设计)。
并将HasImage(或HasContent)列直接放在表中,默认为“false”,当您添加图像时,将其设置为“true”,然后您可以查阅该列以查看是否有图像或不