2010-03-23 82 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

相關問題