为什么我得到“方法没有支持的SQL转换”错误?

时间:2008-12-01 22:35:35

标签: .net asp.net-mvc linq-to-sql c#-3.0

我收到此错误

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

当我尝试将此linq执行到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 fil但是看起来不对

<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;
    }

2 个答案:

答案 0 :(得分:3)

Linq-to-Sql无法将任意.net函数转换为SQL。但是,可以翻译某些DateTime函数,并在此处提供完整列表: -

http://msdn.microsoft.com/en-us/library/bb882657.aspx

在您的示例中,如果计算投影之外的时间偏移量,则可以使用AddMinutes方法将检索到的“CreatedOn”DateTime添加偏移量,该方法具有支持的SQL转换。

答案 1 :(得分:1)

LINQ-to-SQL仅转换操作的子集 - 并尝试(并且失败)将ConvertTimeFromUtc写为TSQL。有些操作有TSQL对应物(dateadd / datediff / etc) - 但不是全部。您可以选择使用原始值进行投影(选择),只有在内存中有对象(通过LINQ到对象)后才能执行ConvertTimeFromUtc。

例如 - 您可以使用p.CreatedOn创建对象,然后再进行其余操作。不理想,但生活。 LINQ-to-Entities声称有更好的翻译选项,但要复杂得多。根据您的场景,LINQ-to-SQL还提供udf支持,有时允许您将这些内容卸载到db - 如果有一种方法可以将其写为udf - 例如,您可以在数据上下文中编写一个方法,并将标记作为可组合函数([Function]),然后类似于:

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

然后使用来自[Function]的TSQL - 例如:

....
    dbo.MapDate(t2.CreatedOn)
....