Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有必要在LINQ查询中不使用方法?_Linq_Linq To Nhibernate - Fatal编程技术网

是否有必要在LINQ查询中不使用方法?

是否有必要在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

在下面的代码中,当我将“dl.DamageCount>5”直接放在查询中,或者当我将“dl.DamageCount>5”移动到一个方法或函数,然后从查询中调用它时,有什么区别吗

当我将其移动到方法中时,查询似乎无法正常工作。事实上,不管条件如何计算,函数/方法似乎总是返回true。我正在用Linq来代替NHibernate

 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);