我得到匿名类型的成员在转换为shortdate时必须用成员赋值声明
本文关键字:成员 shortdate 声明 赋值 类型 转换 | 更新日期: 2023-09-27 17:59:04
我使用的是.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
});
来自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
});
另一个选项,如果您有一个应该为null的变量,并且您正在通过EF向DB进行查询,并且编译器将调用解释为不可为null,但运行时抛出一个可为null的对象,则必须有一个值错误:
var queryResults = query
.Select(
g => new
{
g.Id,
g.Latitude,
g.Longitude,
ParentId = (long?)g.ParentObj2Objs.FirstOrDefault().ParentId
})
.ToList();
您可以看到,ParentId在ParentObj2Objs类型上是不可为null的,所以编译器就像"ParentId"在匿名类型上是Int64类型一样。除了"FirstOrDefault()"可以返回null,从而使查询出错。但是,如果强制它(long?),则可以避免这个问题,因为匿名类型上的ProviderId被正确解释。