为什么在第二种情况下不执行简单的linq命令?

Jim*_*lum 5 c# linq

我的代码中有以下行.

var dates = query.Select(x => EntityFunctions.DiffDays(query.Min(y => y.Date), x.Date));
Run Code Online (Sandbox Code Playgroud)

但是我认为命令query.Min(y => y.Date)是为每个x执行的.

所以我想做以下事情

    System.DateTime varMinDate = query.Min(y => y.Date);
    var dates = query.Select(x => EntityFunctions.DiffDays(varMinDate, x.Date))
Run Code Online (Sandbox Code Playgroud)

我模型中字段Date的类型是 System.DateTime.

但是,如果我以第二种方式更改它,我会得到一个例外

An exception of type 'System.NotSupportedException' occurred in System.Data.Entity.dll but was not handled in user code
Run Code Online (Sandbox Code Playgroud)

编辑

上面提到的查询如下

var query = (from b in db.StudentProgressPerDay
                         where b.Student.Equals(InputStudent)
                         orderby b.Date
                         select b);
Run Code Online (Sandbox Code Playgroud)

这是为什么?我怎么解决它?

Sco*_*ain 1

不,它只执行一次,通过执行query.ToString()我们可以看到 SQL 实体框架将要生成。您的查询生成以下 SQL

SELECT 
    DATEDIFF (day, [GroupBy1].[A1], [Extent1].[Date]) AS [C1]
    FROM  [dbo].[Foos] AS [Extent1]
    CROSS JOIN  (SELECT 
        MIN([Extent2].[Date]) AS [A1]
        FROM [dbo].[Foos] AS [Extent2] ) AS [GroupBy1]
Run Code Online (Sandbox Code Playgroud)

您可以看到它执行单个查询来获取最小值,然后将该查询的结果连接到您的DATEDIFF位置,它将一遍又一遍地重用该单个结果。


测试程序

class Context : DbContext
{
    public DbSet<Foo> Foo { get; set; }
}

public class Foo
{
    public int FooId { get; set; }
    public DateTime Date { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        using (var context = new Context())
        {
            var query = context.Foo;
            var dates = query.Select(x => EntityFunctions.DiffDays(query.Min(y => y.Date), x.Date));

            var result = dates.ToString();

            Debugger.Break();
        }
   } 
}
Run Code Online (Sandbox Code Playgroud)