将自定义字段添加到linq到sql自动生成的实体

时间:2010-03-23 16:18:07

标签: c# linq-to-sql

我有一张图片的varbinary(max)列表格。我已经将表放在LinqToSql设计器上并将“Delay load”设置为true,因为我不想加载实际的图像数据。 是否可以只知道列是否为空,而不是获取实际数据并仍然只从数据库中执行一个查询? 我还想使用Linq创建的自动化实体。 像新bool HasImage {get;}属性这样的东西就是我正在寻找的东西。

3 个答案:

答案 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”,然后您可以查阅该列以查看是否有图像或不