2010-03-23 62 views
3

我有一张表格,其中有一个varbinary(max)列。我已经放弃了LinqToSql设计器的表格,并将“Delay load”设置为true,因为我不想加载实际的图像数据。 是否有可能只知道列是否为空,而没有获取实际数据,仍然只从数据库执行一个查询? 我也想使用由Linq创建的自动实体。 像新的bool HasImage {get;}属性就像我正在寻找的东西。将自定义字段添加到LINQ到sql自动生成的实体

回答

3

Linq to SQL“自动”知道该列是否有值的唯一方法是实际询问数据库。您可以使用字段/属性扩展部分类,但这不会消除查找。

你可以做的一件事是创建一个计算列(假设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添加到SQL实体,不要” t延迟加载它,并检查该属性,而不是明确地检查FooImage属性。

此外,我觉得有必要指出,以这种方式将图像存储在数据库中是次优的。可能有必要,我对你的环境了解不多,但如果你使用的是SQL Server 2008,那么考虑使用FILESTREAM,因为它将使用廉价的“离线”BLOB存储的文件系统而不是填充整个事物在数据库中。

+0

这似乎工作得很好!此外,我在设计器中将新列的类型更改为System.Boolean。 – Karsten 2010-03-24 10:19:21

0

不知道你Q的实际答案,但如果你没有得到答案:如何在DB中自己做改变。 (当然如果你能控制DB设计的话)。

并将HasImage(或HasContent)列直接放在表中,默认为“false”,当您添加图像时,将其设置为“true”,并且您可以查看该列以查看是否有图像或不。

3

创建一个部分类

public partial class MyTableObject 
{ 
    public bool HasImage { get { return MyColumn.HasValue; } } 
} 

这可能会引发数据库命中,虽然

我建议增加一个新的列到数据库“HasImage”位,你设置图像上传时或删除

+0

我试过了,但HasValue在延迟加载时似乎总是错误的。它似乎没有触发对数据库的新查询。所以我的测试表明这是不可能的。但我可能忽略了一些东西:-) – Karsten 2010-03-24 14:40:06

相关问题