为什么我们不能在实体框架查询中使用数组?

时间:2016-06-21 16:27:11

标签: c# .net entity-framework linq

我知道实体框架查询不能包含数组。例如,这将失败:

public class ProposalFB
{
    [Key, ForeignKey("Student"), Column(Order = 0)]
    public string studEmail { get; set; }
    [Key, ForeignKey("Lecturer"), Column(Order = 1)]
    public string lecEmail { get; set; }
    public string feedback1 { get; set; }
    public string feedback2 { get; set; }
    public string feedback3 { get; set; }
    public string feedback4 { get; set; }
    public string feedback5 { get; set; }
    public float proposalMark { get; set; }
    public Nullable<System.DateTime> createdOn { get; set; }
    public Nullable<System.DateTime> modified { get; set; }
    public bool status { get; set; }
    public virtual Student Student { get; set; }
    public virtual Lecturer Lecturer { get; set; }
}

但是,如果我首先将该元素分配给变量:

var myRow = DbContext.myTable.Single(d => d.Property1 == myArray[0].Property1);

然后它有效。为什么编译器不能为我们这样做?它已经在许多其他情况下通过语法糖进行优化并提供了我们的快捷方式。有歧义的来源会阻止编译器在后台将数组元素复制到临时变量中吗?还是其他一些原因?

1 个答案:

答案 0 :(得分:3)

Linq-to-objects可以正常处理 - 它是linq-to-EF(或Linq-to-SQL),它将尝试将表达式转换为SQL。将值放在变量中会告诉提供者您要使用该值,而不是评估表达式。

  

为什么编译器不能为我们这样做?

因为编译器尚未编程以区分应转换为SQL的表达式以及在编译查询之前应评估的表达式。

Linq查询使用延迟执行,这意味着在您要求结果之前,查询实际上并未执行 。在此之前,它只是由构成过滤器,投影,分组,聚合等的各个表达式组成的查询。当它评估表达式d => d.Property1 == myArray[0].Property1时,它评估表达式时间,所以当提供者到达它时,它会尝试将其转换为SQL,而它无法做到。