条件匿名类型

时间:2014-08-21 06:33:43

标签: json linq c#-4.0 asp.net-web-api anonymous-types

我正在使用Web API并使用Anonymous类型将JSON作为输出。我陷入了以下情况:

  • 如果没有可用的记录(VALUE),那么我不想显示该KEY。意思是,Key只应在有价值时出现。

以下是我正在创建的JSON对象 -

    "TU": [
{
"BLOCK": [
[
"00:00",
"00:59"
]
]
}
],
"WE": [],// empty
"TH": [],// empty
"FR": [],// empty
"SA": [] // empty

这里星期二我们有记录,因此它的显示但后来WE,TH,FR,SA没有记录,因此我不想显示它们所以我的结果只是MO / TU。

我正在使用以下代码:

var result = new
        {
            CustomerID = custId,
            DeviceID = dId,
            Kind = kind,
            WebList = filter.Select(filt => new
            {
                URL = filt.FilterName,
                TimeBlockFlag = new ChicoHelper().GetFlag(browserlimit, filt.ID, filt.FilterOptionID, KindId),
                DAILY = browserlimit.Where(xx => xx.FilterID == filt.ID && xx.OptionTypeID == daily).Select(xx => xx.BlockTimeLimit).SingleOrDefault(),
                WEEKLY = browserlimit.Where(xx => xx.FilterID == filt.ID && xx.OptionTypeID == weekly).Select(xx => xx.BlockTimeLimit).SingleOrDefault(),
                MONTHLY = browserlimit.Where(xx => xx.FilterID == filt.ID && xx.OptionTypeID == monthly).Select(xx => xx.BlockTimeLimit).SingleOrDefault(),
                HASVALUES = browserlimit.Where(xx => xx.FilterID == filt.ID).Count() > 0 ? 1 : 0,
                BLOCKTYPE = new ChicoHelper().GetBlockType(browserlimit,filt.ID,filt.FilterOptionID,KindId),
                SU = blockedlimit.Where(x => x.OptionID == sunday && x.FilterID == filt.ID).GroupBy(x => new { x.BlockDay })
                               .Select(x => new
                               {

                                   BLOCK = x.Select(y =>
                                     new[] { y.BlockStartTime.MakeFormatedTime(), y.BlockEndTime.MakeFormatedTime() }
                                   )
                               }),
                MO = blockedlimit.Where(x => x.OptionID == monday && x.FilterID == filt.ID).GroupBy(x => new { x.BlockDay })
                .Select(x => new
                {
                    BLOCK = x.Select(y =>
                      new[] { y.BlockStartTime.MakeFormatedTime(), y.BlockEndTime.MakeFormatedTime() }
                    )
                }),
                TU = blockedlimit.Where(x => x.OptionID == tuesday && x.FilterID == filt.ID).GroupBy(x => new { x.BlockDay })
                               .Select(x => new
                               {
                                   BLOCK = x.Select(y =>
                                     new[] { y.BlockStartTime.MakeFormatedTime(), y.BlockEndTime.MakeFormatedTime() }
                                   )
                               }),
// if i can put some condition like if there is not record for WE then don't show it. 
                WE = blockedlimit.Where(x => x.OptionID == wednesday && x.FilterID == filt.ID).GroupBy(x => new { x.BlockDay })
                .Select(x => new
                {
                    BLOCK = x.Select(y =>
                      new[] { y.BlockStartTime.MakeFormatedTime(), y.BlockEndTime.MakeFormatedTime() }
                    )
                }),

这样做的主要原因是减少移动设备将消耗的JSON大小。 请帮帮我。

1 个答案:

答案 0 :(得分:0)

匿名类型的属性在编译时是固定的 - 您不能使它们成为条件。但是,您可能需要考虑其他一些方法:

  • 如果属性值为null,您可以调查属性是否仍包含在JSON表示中。如果不是,您可以添加一个扩展方法NullIfEmpty(),如果输入为空,则返回null。
  • 您可以先尝试从代码中的匿名类型执行JSON转换,然后删除任何带有空结果集的属性,然后从API返回该JSON对象。 (我自己也不了解Web API,但必须有一种说法&#34;这里是JSON对象 - 请求它的字符串表示&#34;而不是使用匿名类型。)< / LI>
  • 你可以完全抛弃匿名类型,并以编程方式构建JSON表示,只设置你想要的属性。

任何方法中,我强烈建议您提取一种常用方法,根据一周中的某一天提出属性值,这样您就可以:

...
SU = blockedLimit.GetDayBlocks(sunday),
MO = blockedLimit.GetDayBlocks(monday),
TU = blockedLimit.GetDayBlocks(tuesday),
...

没有理由让所有代码重复7次。事实上,在做其他任何事情之前,我可能会重构这一部分 - 它会让实验变得更容易。