【问题标题】:"Method cannot be translated into a store expression" weird behavior“方法不能翻译成商店表达式”奇怪的行为
【发布时间】:2015-02-11 06:25:07
【问题描述】:

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

[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();
}

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    Rohit 的回答或多或少是正确的,但他在 cmets 中的解释是错误的。

    localUser.Times(大概)是一个ICollection&lt;Time&gt;。构建ICollection 需要枚举结果集。引用集合后立即执行查询。您的查询相当于:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我知道延迟执行。但在这两种情况下,“查询”都会在我调用 ToDataTable 扩展时执行(至少我是这么认为的)。
      • @Szer,是的。这就是延迟的意思。这两个查询都在您调用 ToDataTable 方法时执行。但是 linq 执行不像正常执行。为了更好地了解 linq,也更喜欢How does LINQ works internally
      猜你喜欢
      • 2011-10-15
      • 2016-09-06
      • 2015-07-05
      • 1970-01-01
      • 2022-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      相关资源
      最近更新 更多