【发布时间】:2011-07-19 06:11:36
【问题描述】:
我刚刚在 NHibernate 中遇到了一个恰好已经被提出的错误: https://nhibernate.jira.com/browse/NH-2763
我不确定这是否适用于枚举以外的任何其他内容,但是当使用 VB 中的 Lambda 时,它看起来与 C# 中的相同 Lambda 不同。
C#:
Where(x => x.Status == EmployeeStatus.Active)
VB
Where(Function(x) x.Status = EmployeeStatus.Active)
据我所知,它们是一样的吗? (我的 VB 不太好)
如果我在上述代码传入的同一行代码上放置一个断点。在 C# 中我得到:
在传入VB版本的同一行,我得到:
这是我做错了吗?结果是一样的,只是C#/VB的显示不同?
编辑: 好的,所以它们显示不同,但它们不能相同,因为 NHibernate 无法处理它。 NHibernate 可以很好地处理 C# 版本,VB 版本解决了以下异常:
NHibernate StackTrace:
at NHibernate.Impl.ExpressionProcessor.FindMemberExpression(Expression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 168
at NHibernate.Impl.ExpressionProcessor.ProcessSimpleExpression(Expression left, Expression right, ExpressionType nodeType) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 323
at NHibernate.Impl.ExpressionProcessor.ProcessSimpleExpression(BinaryExpression be) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 316
at NHibernate.Impl.ExpressionProcessor.ProcessBinaryExpression(BinaryExpression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 418
at NHibernate.Impl.ExpressionProcessor.ProcessExpression(Expression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 486
at NHibernate.Impl.ExpressionProcessor.ProcessExpression[T](Expression`1 expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 504
at NHibernate.Criterion.QueryOver`2.Add(Expression`1 expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Criterion\QueryOver.cs:line 635
at NHibernate.Criterion.QueryOver`2.NHibernate.IQueryOver<TRoot,TSubType>.Where(Expression`1 expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Criterion\QueryOver.cs:line 686
at *removed*.EmployeeRepository.GetByEntityId(Int64 entityId, Expression`1 basicCriteria) in D:\*removed*\EmployeeRepository.cs:line 76
所以两者之间一定有什么不同?
编辑 2:
对于乔纳森。这是使用表达式的方法:
public IEnumerable<Employee> GetByEntityId(long entityId, Expression<Func<Employee, bool>> basicCriteria)
{
IEnumerable<Employee> result;
using (var tx = Session.BeginTransaction())
{
var employeeQuery = Session.QueryOver<Employee>()
.Where(x => x.EntityId == entityId);
if (basicCriteria != null)
employeeQuery = employeeQuery.Where(basicCriteria);
result = employeeQuery.List();
tx.Commit();
}
return result;
}
【问题讨论】:
-
哇,VB.net 对 lambdas 的调试真是太棒了!
-
@Mehrdad / @fantasticfix - 我已经更新了我的问题以包含异常。 VB 和 C# 版本之间肯定有区别。
-
对不起... bool >> basicCriteria 是做什么的?
-
@Jonathan - 添加了使用“basicCriteria”的方法。无非是提供对结果的次要过滤。在这种情况下,按状态过滤员工。
-
@Petr,和 C# 一样。