5

我编写了一个应用程序,用作代理从数据库中查询数据并自动将其加载到我的分布式 Web 缓存中。

我通过在配置中指定一个 sql 查询和一个类型来做到这一点。实际执行查询的代码如下所示:

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

elementType是从配置中指定的类型创建的 System.Type(使用Type.GetType()),并且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

出于某种原因,当查询被执行时,“Count”属性最终被填充,而不是“FooId”属性。我尝试自己运行查询,并返回正确的列名,并且列名与我在映射属性中指定的匹配。帮助!

4

2 回答 2

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>()方法,所以我不需要相应的映射属性。

更新:一年半后,我终于明白,除非类上有相应的 TableAttribute 装饰,否则属性上的 ColumnAttribute 装饰似乎被忽略了。这解释了为什么“计数”属性被填充,因为它的命名将匹配 SQL 语句中的列,而 FooId/foo_id 当然不匹配。

于 2009-02-26T16:42:30.627 回答
2

当属性的名称与列的名称不同时,Linq To Sql 很难映射东西。尝试使用下划线将您的属性名称更改为 foo_id。那应该是诀窍。

要么,或者您可以将您的选择语句更改为 foo_id 作为 FooId 以匹配您的属性。无论哪种方式,它们应该是相同的(尽管不需要是相同的情况)。

于 2009-02-26T16:28:04.187 回答