"方法无法转化为商店表达式"奇怪的行为

时间:2015-02-11 06:25:08

标签: c# entity-framework

我有这两个模型有一对多关系:

[Table("User")]
public class User
{
    public User()
    {
        Times = new HashSet<Time>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid Guid { get; set; }

    public virtual ICollection<Time> Times { get; set; }
}

[Table("Time")]
public class Time
{
    [Key]
    public long TimeId { get; set; }
    public DateTime WorkDay { get; set; }
    public Guid UserGuid { get; set; }
    public virtual User User { get; set; }
}

返回DataTable的上下文类中的方法。 查询通过后,第一个实现失败.ToDataTable()扩展名(或.ToList()或其他) 例外:

LINQ to Entities does not recognize the method 'System.String ToShortDateString()' method, and this method cannot be translated into a store expression

第二个完全没问题。 问题是为什么?

首先实施。它不起作用

public DataTable GetDtProjectsForUser(User user)
{
    var query = from time in Time
                select new
                {
                    WorkDay = time.WorkDay.ToShortDateString(),
                };
    return query.ToDataTable();
}

第二个。它可以工作

public DataTable GetDtProjectsForUser(User user)
{
    var localUser = User.Find(user.Guid);
    var query = from time in localUser.Times
                select new
                {
                    WorkDay = time.WorkDay.ToShortDateString(),
                };
    return query.ToDataTable();
}

2 个答案:

答案 0 :(得分:2)

罗希特的回答或多或少是正确的,但他在评论中的解释是错误的。

localUser.Times(大概)是ICollection<Time>。构建ICollection需要枚举结果集。一旦引用了集合,就会执行查询。您的查询等同于:

var collection = localUser.Times.Select(t => new { WorkDay = t.WorkDay.ToShortDateString() });

只要执行localUser.Times,就会对数据库进行查询并加载Times集合。随后的.Select()是LINQ to Objects查询。

答案 1 :(得分:0)

Linq是延迟执行。在第一个代码中,Time变量不存储在内存中,而在第二个代码中,您已将集合存储在localUser变量中。
您可以在Charlie Calvert's Community Blog了解有关linq和延迟执行的更多信息。