代码之家  ›  专栏  ›  技术社区  ›  Joe Belladonna

C#Linq列名为两个单词(去年)或带前导零的数字(01)

  •  1
  • Joe Belladonna  · 技术社区  · 6 年前

    从存储过程中,我获得了列名称如下的数据 Last year 01 ,则, 02 ,则, 03 。。。在第一种情况下,列名由两个单词组成,在其他情况下,列名是前导为零的数字。我知道这个存储过程的设计者做了一些愚蠢的事情,但是 我无法更改存储过程。 我的目标是按列对数据进行分组,然后按这些奇怪的列名求和,但VS2017不喜欢这样。我做了以下工作:

    var list = (from r in dataFromSP
        group r by new { r.TicketTypeName, r.PaymentMonth } into grp
        select new
        {
            grp.Key.TicketTypeName,
            grp.Key.PaymentMonth,
            LastYear = grp.Sum(t => (decimal?)t.Last year),
            M01 = grp.Sum(t => (decimal?)t.01),
            M02 = grp.Sum(t => (decimal?)t.02),
            M03 = grp.Sum(t => (decimal?)t.03),
            M04 = grp.Sum(t => (decimal?)t.04),
            M05 = grp.Sum(t => (decimal?)t.05),
            M06 = grp.Sum(t => (decimal?)t.06),
            M07 = grp.Sum(t => (decimal?)t.07),
            M08 = grp.Sum(t => (decimal?)t.08),
            M09 = grp.Sum(t => (decimal?)t.09),
            M10 = grp.Sum(t => (decimal?)t.10),
            M11 = grp.Sum(t => (decimal?)t.11),
            M12 = grp.Sum(t => (decimal?)t.12)
    }).ToList<dynamic>();
    

    我不知道如何将LINQ与这些奇怪的列名一起使用。我尝试了[],

    LastYear = grp.Sum(t => (decimal?)t.[Last year]),
    M01 = grp.Sum(t => (decimal?)t.[01]),
    

    并带有“”,

    LastYear = grp.Sum(t => (decimal?)t."Last year"),
    M01 = grp.Sum(t => (decimal?)t."01"),
    

    但是没有运气。有没有可能在LINQ中使用这些奇怪的列名,有没有办法解决这种奇怪的情况?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Michał Å»ołnieruk    6 年前

    使用映射类并将您的特殊列名放入列属性中,如下所示。然后您就可以毫无问题地使用字段名。

    [Table(Name="TableNumbers")]
    public class Numbers
    {
        [Column(Name="Last year")]
        public int LastYear;
    
        [Column(Name="01")]
        public int First;
    }
    

    资料来源: https://msdn.microsoft.com/en-us/library/bb386983(v=vs.100).aspx

        2
  •  0
  •   Joe Belladonna    6 年前

    我已经设法解决了这个问题。玛瑙帮我指明了正确的方向,所以谢谢你玛瑙。

    这就是帮助我的原因:

    var list = (from r in dataFromSP
        group r by new { r.TicketTypeName, r.PaymentMonth } into grp
        select new
        {
            grp.Key.TicketTypeName,
            grp.Key.PaymentMonth,
            LastYear = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["Last year"]),
            M01 = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["01"]),
            M02 = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["02"]),
            M03 = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["03"]),
            M04 = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["04"]),
            M05 = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["05"]),
            M06 = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["06"]),
            M07 = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["07"]),
            M08 = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["08"]),
            M09 = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["09"]),
            M10 = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["10"]),
            M11 = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["11"]),
            M12 = grp.Sum(t => (decimal?)((IDictionary<String, Object>)t)["12"]),
    }).ToList<dynamic>();