在转换为shortdate时,我必须使用成员赋值声明匿名类型成员吗?

时间:2014-04-20 23:47:12

标签: c# wcf casting

我正在使用.net 3.5 WCF,我需要将日期字段“r.DateReceived”转换为shortdate。什么时候 我尝试使用.toShortDateString(),我收到警告“必须使用成员分配声明匿名类型成员”。结果将转换为Json。

var json = from r in results
                       select Convert(new
                       {
                           r.CaseId,
                           r.TamisCaseNo,
                           r.TaxPdr,
                           r.OarNo,
                           r.Tin,
                           r.DateReceived,
                           r.IdrsOrgAssigned,
                           r.IdrsTeAssigned,
                           r.DateRequestComp
                       });

2 个答案:

答案 0 :(得分:6)

来自MSDN

  

如果未在匿名类型中指定成员名称,则编译器会为匿名类型成员提供与用于初始化它们的属性相同的名称。您必须为使用表达式

初始化的属性提供名称

因此,只有初始化程序直接绑定到属性或字段时,才能推断出匿名类型的属性名称。如果您正在调用方法或使用其他某种表达式,则需要明确指定属性名称,如下所示:

var json = from r in results
                   select Convert(new
                   {
                       r.CaseId,
                       r.TamisCaseNo,
                       r.TaxPdr,
                       r.OarNo,
                       r.Tin,
                       DateReceived = r.DateReceived.ToShortDateString(),
                       r.IdrsOrgAssigned,
                       r.IdrsTeAssigned,
                       r.DateRequestComp
                   });

答案 1 :(得分:0)

另一个选项,如果你有一个应该可以为空的变量,并且你通过EF向数据库进行查询,并且编译器将该调用解释为非可空,但运行时抛出一个可空的对象必须有一个价值错误:

            var queryResults = query
                .Select(
                    g => new
                    {
                        g.Id,
                        g.Latitude,
                        g.Longitude,
                        ParentId = (long?)g.ParentObj2Objs.FirstOrDefault().ParentId
                    })
                .ToList();

你看,ParentId在类型ParentObj2Objs上不可为空,所以编译器就像" ParentId"是匿名类型的Int64类型。除了" FirstOrDefault()"可以返回null,从而查询错误输出。但强制它(长?),你可以避免这个问题,因为匿名类型的ProviderId被正确解释。