English 中文(简体)
LINQ-to-SQL:ExecuteQuery(类型,字符串)填充一个字段,但不填充另一个。
原标题:
  • 时间:2009-02-26 15:47:15
  •  标签:

我写了一个应用程序,我使用它作为代理查询数据库中的数据,并自动加载到我的分布式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”属性却没有被填充。我尝试自己运行查询,正确的列名被返回,并且列名与我在映射属性中指定的匹配。帮帮我!

最佳回答

这真的太疯狂了...

解决我的问题的方法是在实体类上使用 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当然不匹配。

问题回答

当属性名与列名不同时,Linq To Sql很难映射这些内容。尝试将您的属性名更改为带有下划线的foo_id。这样应该就可以解决了。

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





相关问题