为什么在第二种情况下不执行简单的linq命令?
我的代码中有以下行。
var dates = query.Select(x => EntityFunctions.DiffDays(query.Min(y => y.Date), x.Date));
但是我认为命令query.Min(y => y.Date)是为每个x执行的。
所以我想做以下事情
System.DateTime varMinDate = query.Min(y => y.Date); var dates = query.Select(x => EntityFunctions.DiffDays(varMinDate, x.Date))
我模型中字段Date的类型是System.DateTime.
但是,如果我以第二种方式更改它,我会得到一个例外
An exception of type 'System.NotSupportedException' occurred in System.Data.Entity.dll but was not handled in user code
编辑
上面提到的查询如下
var query = (from b in db.StudentProgressPerDay where b.Student.Equals(InputStudent) orderby b.Date select b);
这是为什么? 我怎么解决它?
不,它只执行一次,通过执行query.ToString()
我们可以看到SQLentity framework将要生成。 您的查询生成以下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]
您可以看到它执行单个查询以获得最小值,然后它将该查询的结果连接到您的DATEDIFF
,在那里它将反复使用该单个结果。
测试程序
class Context : DbContext { public DbSet 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(); } } }