是否有必要在LINQ查询中不使用方法?
在下面的代码中,当我将“dl.DamageCount>5”直接放在查询中,或者当我将“dl.DamageCount>5”移动到一个方法或函数,然后从查询中调用它时,有什么区别吗 当我将其移动到方法中时,查询似乎无法正常工作。事实上,不管条件如何计算,函数/方法似乎总是返回true。我正在用Linq来代替NHibernate是否有必要在LINQ查询中不使用方法?,linq,linq-to-nhibernate,Linq,Linq To Nhibernate,在下面的代码中,当我将“dl.DamageCount>5”直接放在查询中,或者当我将“dl.DamageCount>5”移动到一个方法或函数,然后从查询中调用它时,有什么区别吗 当我将其移动到方法中时,查询似乎无法正常工作。事实上,不管条件如何计算,函数/方法似乎总是返回true。我正在用Linq来代替NHibernate var q = from dl in session.Linq<DamageList>() where dl.D
var q = from dl in session.Linq<DamageList>()
where
dl.DamageCount > 5
var q=来自会话中的dl.Linq()
哪里
dl.损伤计数>5
您所能做的最好的事情就是在表达式中捕获谓词。一个方法已经编译成IL,因此Linq提供程序无法将其分离
Expression<Func<DamageList, bool>> predicate = item => item.DamageCount > 5;
如果要动态组合两个这样的表达式,可以将这两个表达式的代码写入一个表达式,或者在单独的表达式中捕获这两个表达式。这会变得复杂,因为您需要每个项目都引用传入的项。这确实是一个不同的问题,已经被问到了:
您可以使用&&oerator编写复合谓词,但仍可以在表达式中捕获它:
Expression<Func<DamageList, bool>> predicate =
dl => dl.DamageCount > 5 && dl.Name.Contains(criteria);
表达式谓词=
dl=>dl.DamageCount>5&&dl.Name.Contains(标准);
您询问如何在这样的表达式中调用方法-好吧,该示例确实调用了一个方法
它构建了各种类型的Expression
节点树。其中包括一个方法调用节点,该节点表示调用字符串的Contains
方法(假设Name
是字符串
)。这是一个嵌入在表达式中的方法调用指令的示例。为了实现这一点,Linq提供程序必须知道该方法的功能,以便将其转换为等效的SQL(典型的ORM系统就是这样)
因此,您可以在表达式中嵌入某些标准方法调用,这需要Linq提供程序了解它们。string
的方法定义得很好,但并非每个提供者都能处理所有这些方法
Linq提供程序允许您添加自己的扩展来处理额外的方法,这并非不可能,但我不知道有哪种扩展支持这一点(显然,如果系统是开源的,您可以添加自己的扩展)
总之,Linq提供程序需要一个表达式节点树,它可以对这些节点进行分析,将其转换为其他语言(如SQL),以便在另一个上下文(如远程数据库)中执行。如果编写普通方法,C#编译器将把它们编译成低级可执行IL,而不是表达式节点。这就像是一条死胡同:没有内置的工具将IL转换回表达式节点。那么我有多个条件呢?例如:如果dl.DamageCount>5&&dl.Name.Contains(条件)亲爱的Earwicker,还有一个问题:是否可以使用此表达式调用另一个方法?我的意思是:表达式谓词=MyFunc();
Expression<Func<DamageList, bool>> predicate =
dl => dl.DamageCount > 5 && dl.Name.Contains(criteria);