gpt4 book ai didi

c# - Linq to SQL 内部 .NET Framework 数据提供程序错误 1025

转载 作者:太空狗 更新时间:2023-10-30 01:02:49 24 4
gpt4 key购买 nike

谁能告诉我为什么我不能以这种方式从 Entity Framework 的 MS SQL 数据库中选择新对象:

public static Expression<Func<LeaveDay, bool>> IsInDatesRange(DateTime startDate, DateTime endDate){
return ld => ld.StartDate <= endDate && ld.EndDate >= startDate;
}


this.ObjectContext.People.Select(p => new NewPeopleObject
{
Guid = p.Guid,
FirstName = p.FirstName,
LastName = p.LastName,
LeaveDays = p.CalendarData.LeaveDays.AsQueryable()
.Where(LeaveDayExpressions.IsInDatesRange(startDate, endDate))
.Select(ld => new LeaveDaySummary
{
StartDate = ld.StartDate,
EndDate = ld.EndDate,
})
})

没有 AsQueryable() 我无法编译应用程序,因为 LeaveDayExpressions.IsInDatesRange 是静态表达式。我试过只将 Func 传递给 Where 子句,但它抛出内部 .NET Framework 数据提供程序错误 1025。在 LeaveDays 上使用 Expression 和 AsQueryable 我得到这个异常(exception):

Code supposed to be unreachable

People 是 ObjectSet 集合,在一个 People 上有一个 CalendarData 对象,CalendarDataEntityCollection 一组 LeaveDays

NewPeopleObject 是一个具有少量属性和 IEnumarable LeaveDaySummaries 集合的类。

如何将 Expression 传递给 Where 子句而不会出现 linq to sql 错误解析?

最佳答案

我无法测试确切的情况(ObjectContextObjectSet 等表示一些较旧的 EF 版本),但我能够在最新的 EF6.1.3(使用 DbContextDbSet)也是如此。

让我们忘记 Func 方法 - EF 需要将查询转换为 SQL,因此 Expression 是必须的。这又需要 AsQueryable()。到目前为止,一切都很好。

问题是 EF 不喜欢表达式树中的自定义方法 - 它通常与顶级方法没有问题,但肯定与示例中的嵌套调用有问题(有问题的表达式是外部选择表达式的一部分) .

我不知道为什么,但在大多数情况下(包括这种情况和可能的情况)将表达式放入查询外部的局部变量并在内部使用它可以解决问题:

var leaveDayPredicate = LeaveDayExpressions.IsInDatesRange(startDate, endDate);
var result = this.ObjectContext.People.Select(p => new NewPeopleObject
{
Guid = p.Guid,
FirstName = p.FirstName,
LastName = p.LastName,
LeaveDays = p.CalendarData.LeaveDays.AsQueryable()
.Where(leaveDayPredicate)
.Select(ld => new LeaveDaySummary
{
StartDate = ld.StartDate,
EndDate = ld.EndDate,
})
});

对于更高级的场景(比如使用外部表达式的表达式),您可能需要一些表达式处理库,例如 LINQKit Invoke/Expand/AsExpandable 自定义扩展方法等

关于c# - Linq to SQL 内部 .NET Framework 数据提供程序错误 1025,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32206992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com