2009-02-26 45 views
5

我編寫了一個應用程序,用作代理從數據庫查詢數據並自動將其加載到分佈式Web緩存中。LINQ-to-SQL:ExecuteQuery(類型,字符串)填充一個字段,但不填充另一個

我這樣做是通過在配置中指定一個sql查詢和一個類型。實際執行所述查詢的代碼看起來是這樣的:

List<Object> result = null; 
try { result = dc.ExecuteQuery(elementType, entry.Command).OfType<Object>().ToList(); } 
catch (Exception ex) { HandleException(ex, WebCacheAgentLogEvent.DatabaseExecutionError); continue; } 

elementType距離(使用Type.GetType())在配置中指定的類型創建一個System.Type的,並且是entry.Command SQL查詢。

我遇到看起來像這樣的問題,具體的實體類型:

public class FooCount 
{ 
    [Column(Name = "foo_id")] 
    public Int32 FooId { get; set; } 

    [Column(Name = "count")] 
    public Int32 Count { get; set; } 
} 

SQL查詢看起來是這樣的:

select foo_id as foo_id, sum(count) as [count] 
from foo_aggregates 
group by foo_id 
order by foo_id 

出於某種原因,在執行查詢, 「計數」屬性結束填充,但不是「FooId」屬性。我試着自己運行查詢,並返回正確的列名稱,列名與我在映射屬性中指定的內容匹配。幫幫我!

+0

@BFree - 編輯一個問題只是爲了改變別人的編碼風格只是簡單的恕我直言。請不要。 – 2009-02-26 16:18:12

+0

我的不好。我不認爲你真的打算這麼做,我認爲這是一個意外。 – BFree 2009-02-26 16:27:18

+0

@Daniel - 發佈強制用戶滾動閱讀的代碼是讓他們忽略你的問題的好方法。在試圖幫助的人尋找是一種更好的方式..... – 2009-02-26 16:33:57

回答

5

這是瘋了...

什麼固定我的問題是裝飾我的實體類TableAttribute

[Table(Name = "foo_aggregates")] 
public class FooCount 
{ 
    [Column(Name = "foo_id")] 
    public Int32 FooId { get; set; } 

    [Column(Name = "count")] 
    public Int32 Count { get; set; } 
} 

我本以爲(錯,顯然),由於我沒有使用GetTable<T>()方法,我不需要相應的映射屬性。

更新:一年半後,它終於在我身上看起來像屬性上的ColumnAttribute裝飾被忽略,除非在類上有相應的TableAttribute裝飾。這解釋了爲什麼「Count」屬性得到填充,因爲它的命名將匹配SQL語句中的列,而FooId/foo_id當然不匹配。

2

Linq To Sql在屬性的名稱與列的名稱不同時映射了一些東西。嘗試使用下劃線將您的屬性名稱更改爲foo_id。這應該是訣竅。

或者,或者您可以將您的select語句更改爲foo_id作爲FooId以匹配您的屬性。無論哪種方式,他們應該是相同的(不需要是相同的情況下)。