代码之家  ›  专栏  ›  技术社区  ›  Daniel Schaffer

linq to sql:executequery(type,string)填充一个字段,但不填充另一个字段

  •  5
  • Daniel Schaffer  · 技术社区  · 16 年前

    我已经编写了一个应用程序,作为一个代理,我可以从数据库中查询数据并自动将其加载到我的分布式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”属性最终会被填充,而不是“food”属性。我自己尝试运行查询,并返回正确的列名,列名与我在映射属性中指定的内容匹配。救命!

    2 回复  |  直到 14 年前
        1
  •  5
  •   Daniel Schaffer    14 年前

    这太疯狂了…

    解决我问题的是用什么来装饰我的实体类 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装饰,否则属性上的ColumnalAttribute装饰似乎被忽略了。这解释了为什么要填充“count”属性,因为它的命名将与SQL语句中的列匹配,而foo id/foo-id当然不匹配。

        2
  •  2
  •   BFree    16 年前

    当属性的名称与列的名称不同时,Linq to SQL具有很难映射的特性。尝试用下划线将属性名更改为foo_id。这应该是技巧。

    或者,您可以将select语句更改为foo-id作为foo id来匹配您的属性。不管怎样,它们应该是相同的(但不需要是相同的情况)。