LINQ-to-SQL:ExecuteQuery(Type,String)填充一个字段,但不填充另一个字段

时间:2009-02-26 15:47:15

标签: c# .net linq-to-sql datacontext executequery

我编写了一个应用程序,用作代理程序从数据库查询数据并自动将其加载到我的分布式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”属性。我自己尝试运行查询,并返回正确的列名,列名与我在映射属性中指定的名称相匹配。救命啊!

2 个答案:

答案 0 :(得分: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当然不匹配。

答案 1 :(得分:2)

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

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

相关问题