[asp.net-mvc]为什么会"方法具有不受支持的转换为 SQL"错误?

标签: Asp.net-MVC .Net
发布时间: 2017/3/25 10:36:28
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我得到这个错误

{"Method 'System.DateTime ConvertTimeFromUtc(System.DateTime, System.TimeZoneInfo)' has no supported translation to SQL."}  

当我尝试执行此 linq to sql 中

var query = from p in db.Posts
            let categories = GetCategoriesByPostId(p.PostId)
            let comments = GetCommentsByPostId(p.PostId)
            select new Subnus.MVC.Data.Model.Post
            {
                Categories = new LazyList<Category>(categories),
                Comments = new LazyList<Comment>(comments),
                PostId = p.PostId,
                Slug = p.Slug,
                Title = p.Title,
                CreatedBy = p.CreatedBy,
                CreatedOn = TimeZoneInfo.ConvertTimeFromUtc(p.CreatedOn, TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time")),
                Body = p.Body
            };
return query;

还有另一个地方,我可以将日期转换为正确的格式目前我有一个宏,我我 _global.spark 过滤,但这似乎错了

<macro name="DateAndTime" Date="DateTime">
# Date = TimeZoneInfo.ConvertTimeFromUtc(Date, TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time"));
${Date.ToString("MMMM d, yyyy")} at ${Date.ToString("hh:mm")}
</macro>
<macro name="Date" Date="DateTime">
# Date = TimeZoneInfo.ConvertTimeFromUtc(Date, TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time"));
${Date.ToString("MMMM d, yyyy")}
</macro> 

更新︰我现在明白这些代码不工作,但当我把它删除我得到然后同样的错误,为此代码

 public IQueryable<Subnus.MVC.Data.Model.Comment> GetCommentsByPostId(int postId)
    {
        var query = from c in db.Comments
                    where c.PostId == postId
                    select new Subnus.MVC.Data.Model.Comment
                    {
                        Body = c.Body,
                        EMail = c.EMail,
                        Date = c.CreatedOn,
                        WebSite = c.Website,
                        Name = c.Name
                    };

        return query;
    }

解决方法 1:

LINQ 到 SQL 仅仅只是转换操作-和它试图 (和失败) 的一个子集来写作为 TSQL ConvertTimeFromUtc。某些操作有 TSQL 同行 (datediff/dateadd/等)-但不是全部。你可能会选择做您的投影 (选择) 使用的原始值和只做 ConvertTimeFromUtc 一次你在内存 (通过 LINQ 到对象) 的对象。

例如-您可以创建的对象只用 p.CreatedOn,然后之后做的休息。不理想,但生活。LINQ 实体索赔更好的转换选项,但明显更加复杂。具体取决于您的方案,LINQ 到 SQL 还提供 udf 支持,哪有时让你卸载这些东西给 db-如果有是一种写法作为 udf — — 例如,你可以写一种方法对数据上下文和马克是作为可组合的函数 ( [Function] ),然后类似︰

 ...
    CreatedOn = ctx.MapDate(p.CreatedOn)
 ....

然后将使用从 TSQL [Function] -即类似︰

....
    dbo.MapDate(t2.CreatedOn)
....
赞助商