【问题标题】:Converting DateTime when using LINQ and WebAPI?使用 LINQ 和 WebAPI 时转换 DateTime?
【发布时间】:2015-05-08 05:19:35
【问题描述】:

我在使用 LINQ 将我从数据库收集的日期时间转换为本地时间时遇到问题。 LINQ 查询不允许我使用 ToLocalTime(),而且我似乎无法在查询之外获得任何修复来处理匿名类型的列表。

这是来自控制器的 LINQ 查询:

                    // GET: api/Scan
    public object Getv_Update_ComplianceStatusAll()
    {
        var dato = DateTime.Now.AddYears(-1);


        var scan = (from n in db.C_RES_COLL_NO9000AC
                    join s in db.v_Update_ComplianceStatusAll on n.MachineID equals s.ResourceID
                    join u in db.v_UpdateInfo on s.CI_ID equals u.CI_ID
                    join c in db.v_CICategoryInfo on u.CI_ID equals c.CI_ID
                    where (n.MachineID == s.ResourceID) && (u.DateRevised > dato) 
                    group s by new { n.Name } into grp
                    select new
                    {
                        Name = grp.Key.Name,
                        StatusScan = grp.Max(t=> t.LastStatusCheckTime)


                    });


        return scan;
    }

这是我在查询之外的修复尝试:

            var newScan = scan.ToList();

        foreach (var s in newScan)
        {

            s.StatusScan = s.StatusScan.ToLocalTime();
        }

        return newScan;

转换有效,但返回“错误 306 属性或索引器 'AnonymousType#1.StatusScan' 不能分配给 -- 它是只读的”

那么,如何在控制器中将 UTC 转换为本地时间(在我将任何内容返回到网站之前)?

【问题讨论】:

  • 您是否尝试过使用强类型变量?即:创建 ViewModel?
  • 需要服务器本地时间还是客户端本地时间?

标签: c# linq datetime asp.net-web-api


【解决方案1】:

是的,匿名类型很方便,但从方法中返回它是个坏主意——局外人不知道object 到底是什么。建议创建一个强类型来存储结果并返回IEnumerable<ScanItem>。然后你就可以修改结果了。

public class ScanItem
{
    public string Name { get; set; }
    public datetime StatusScan { get; set; }
}

如果你必须使用Anonymous Type,你可以像这样建立一个新的列表

scan.ToList().Select(i => new {Name = i.Name, StatusScan = i.StatusScan.ToLocalTime()});

【讨论】:

  • 谢谢!这对我帮助很大。 :)
【解决方案2】:
    var newScan = scan.ToList();

    foreach (var s in newScan)
    {
        s.StatusScan = s.StatusScan.ToLocalTime();
    }

    return newScan;

你的newScan是一个List,你不能直接赋值

s.StatusScan = s.StatusScan.ToLocalTime();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多