Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;方法无法转换为存储表达式;奇怪的行为_C#_Entity Framework - Fatal编程技术网

C# &引用;方法无法转换为存储表达式;奇怪的行为

C# &引用;方法无法转换为存储表达式;奇怪的行为,c#,entity-framework,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 ICo

我有两个模型,它们有一个多个关系:

[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; }
}
第二个很好。 问题是为什么

第一次执行。它不起作用

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

Linq是一个延迟执行。在第一个代码中,时间变量不存储在内存中,而在第二个代码中,将集合存储在
localUser
变量中。

关于linq和延迟执行的更多信息,请访问。

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

localUser.Times
大概是一个
ICollection
。构建一个
ICollection
需要枚举结果集。一旦引用集合,就会执行查询。您的查询相当于:

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

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

是的,我知道延迟执行。但在这两种情况下,“查询”都是在我调用ToDataTable扩展时执行的(至少我这么认为)。@Szer,是的。这就是推迟对我们的意义。这两个查询都在调用ToDataTable方法时执行。但是linq执行与正常执行不同。为了更好地了解linq,还希望
var collection = localUser.Times.Select(t => new { WorkDay = t.WorkDay.ToShortDateString() });