2009-02-26 66 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以匹配您的属性。无论哪种方式,他们应该是相同的(不需要是相同的情况下)。