- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用表达式创建动态 nhibernate 查询。我对 Contains、StartsWith 和 EndsWith 等函数没有问题,但我似乎无法让它与 IsNullOrEmpty 一起使用。这是一些上下文:
包含:
MethodInfo contains = typeof(string).GetMethod("Contains", new Type[] { typeof(string) });
ParameterExpression param = Expression.Parameter(typeof(MyType), "x");
Expression expression = null;
PropertyInfo info = typeof(MyType).Property("MyStringProperty");
expression = Expression.Property(param, info);
expression = Expression.Call(expression, info, Expression.Constant("Does it contain this string", typeof(string)));
在所有这一切的最后,表达式在调试器中是这样的:
expression = { x.MyStringProperty };
然后我把它变成一个 lambda 表达式:
var finalExpression = Expression.Lambda<Func<MyType, bool>>(expression, param);
最后,finalExpression 是这样的:
x => x.MyStringProperty.Contains("Does it contain this string");
当我通过 nhibernate 运行它时,它完全按照我的要求运行。不过,有了 IsNullOrEmpty,这就是我所拥有的:
MethodInfo isNull = typeof(string).GetMethod("IsNullOrEmpty", new Type[] { typeof(string) } );
ParameterExpression param = Expression.Parameter(typeof(MyType), "x");
PropertyInfo info = typeof(MyType).GetProperty("MyStringProperty");
expression = Expression.Property(param, info);
expression = Expression.Call(isNull, expression);
最后,表达式等于:
expression = { IsNullOrEmpty(x.MyStringProperty) }
在 lambda 转换之后它变成:
finalExpression = { x => IsNullOrEmpty(x) }
这看起来完全像它应该的那样(虽然我承认它可能应该读作 string.IsNullOrEmpty(x)),但是当我通过 nhibernate 运行它时,我得到错误:
NotSupportedException
Message: Boolean IsNullOrEmpty(System.String)
有人知道这是为什么吗?如果我运行一个非动态查询并像这样手写一个 where 子句,它可以正常工作:
nhibernateDataProvider.Where(x => string.IsNullOrEmpty(x.MySTringProperty));
有人知道这是为什么/如何解决这个问题?
编辑:
我为什么要这样做:
在我的网络层中,我向用户显示了这个 x.MyStringProperty 数据。他们有能力通过这个属性进行过滤,而我希望能够通过这些字符串方法来过滤数据。 Web 层只是将这些函数传回:
BeginsWith
EndsWith
Contains
IsNullOrEmpty
NotIsNullOrEmpty
根据这些名称,我可以使用上述代码直接将它们转换为字符串方法。因此,我可以传递 Web 层中的任何类型,并能够过滤任何字符串属性。这是非常强大的,因为对于我所有的数百个类,我可以有一个方法来处理每个类的过滤。正如我之前所说,IT 使用非静态方法,因为构建的表达式是:
x -> x.MyStringProperty.NonStaticMethod("SomeFilterValue");
在 Expression.Call 的文档中说得对,您也应该能够使用静态方法来执行此操作。由于它适用于非静态方法,因此必须有一种方法来执行 IsNullOrEmpty,使表达式变为
x -> string.StaticMethod(x.MyStringProperty)
我敢打赌,如果我创建表达式,它会起作用
x -> x.MySTringProperty == null || x.MySTringProperty == ""
但这是一种解决方法,作为一名程序员,我觉得不符合原则,我需要找出如何使用静态方法执行上述操作。
最佳答案
我只是不确定您要在这里实现什么。 动态表达式查询语言 已经存在:它是内置的 LINQ 提供程序。但是,让我们尝试为您提供有关其实现的更多信息。
当内置的 Linq 提供程序接收到由表达式树表示的查询时,将使用访问者模式将其转换为 SQL(中间有一个 HQL 步骤)。一个强大的部分是由接口(interface) IHqlGeneratorForMethod
public interface IHqlGeneratorForMethod
{
IEnumerable<MethodInfo> SupportedMethods { get; }
HqlTreeNode BuildHql(MethodInfo method, Expression targetObject
, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder
, IHqlExpressionVisitor visitor);
}
这里的重要部分是一组实现者:
DictionaryItemGenerator
DictionaryContainsKeyGenerator
EqualsGenerator
BoolEqualsGenerator
MathGenerator
AnyHqlGenerator
AllHqlGenerator
MinHqlGenerator
MaxHqlGenerator
CollectionContainsGenerator
HqlGeneratorForExtensionMethod
StartsWithGenerator // StartsWith
EndsWithGenerator // EndsWith
ContainsGenerator // Contains
ToLowerGenerator
ToUpperGenerator
SubStringGenerator
IndexOfGenerator
ReplaceGenerator
TrimGenerator
如您所见,负责Contains
、EndsWith
和StartsWith
。但是在那里找不到IsNullOrEmpty。
换句话说,无论您在全局中做什么,您的 IsNullOrEmpty 都应该以这样的语句结尾:
.Where(x => x.MyProperty == null || x.MyProperty == "")
关于c# - 使用 String.IsNullOrEmpty(string) 和 Nhibernate 创建动态 Linq 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21340642/
这个问题在这里已经有了答案: What is the difference between String and string in C#? (65 个答案) 关闭 1 年前。 过去 3 天我一直在
有人可以向我解释为什么在 .NET 中我会编写 String.IsNullOrEmpty(str) 而不是 str.IsNullOrEmpty() 吗?一定有一个合乎逻辑的原因,但我不知道。 这听起来
.NET 库有 String.IsNullOrEmpty(value As String) . 我可以创造更舒适.IsNullOrEmpty()通过简单的扩展方法: Function IsNullO
多年来我一直在写 String.IsNullOrEmpty,在 Visual Studio 2015 中,IDE 建议将其重构为 string.IsNullEmpty,为什么?你会怎么做? 我很清楚
protected void EditButton_Click(object sender, EventArgs e) { TextBox tdcd = (TextBox)Fo
在HTML中存在 required 属性,强制用户在提交之前输入某个日期。但用户只能输入空格。是否有属性在回发之前检查键入的内容是否为空格。需要属性,其工作方式类似于 c# 中的 string.IsN
IsNullOrEmpty 与字符串一起使用以检查字符串是否为 null 或空。是否有一个对象的等价物来查看任何对象是否为空?我想我们可以做到 obj1 != null 但不确定是否有其他方法
首先,我想我知道发生了什么,但我想我会在这里提出这个问题进行一些讨论,看看是否有人对此有与我的想法不同的“答案”。因为,这对我来说完全没有意义。 我发现,在为异常创建错误日志时,我这样做了,但它不起作
我正在尝试将一个 combobox.selectedValue 设置为一个有效的字符串,但是当它的 nullorempty 时它会出错。我尝试了以下代码无济于事: if (string
我正在尝试创建一个方法来检查 null/nil/空字符串,并且我试图让它作为一个类别工作,但没有成功。 我正在使用此代码,基于 this topic 中的答案: @implementation NSS
我正在查看我用 C# 编写的一段代码: if(string.IsNullOrEmpty(param1) && string.IsNullOrEmpty(param2) && string.IsNull
这两种检查字符串的方式有什么区别吗? if(!string.IsNullOrEmpty(myString)) { //Do something } 和 if(myString != null &&
如果 string.Empty != null 为什么要创建 string.IsNullOrEmpty()? 我只想说: 如果 null 和 string.Empty 彼此不同。 为什么 string
当试图确定一个字符串是否为 null 或空时,我通常已经有了该字符串。这就是为什么我希望像 String.IsNullOrEmpty() 这样的实用函数可以在没有参数的情况下工作: String my
需要什么才能使 String.IsNullOrEmpty() 将空白字符串计为空字符串? 例如。我希望以下内容返回 true 而不是通常的 false: String.IsNullOrEmpty("
我总是(thing != undefined || thing != null)?...:...; 检查。在 javascript 或 jquery 中进行此检查后,是否有任何方法会返回 bool ?
我正在处理一个遗留应用程序,但我的 VB6 技能不太好。我需要检查 String 字段是否已初始化并设置为 null/nothing 或空字符串以外的其他内容。在 C# 中我会做类似的事情: if (
我有一个像这样的单一条件的简单方法。 如果(字符串.IsNullOrEmpty(名字)) { 成功=假; 返回成功; 当我运行 Pex 时,它只生成一个将 Null 分配给 FirstName 属性的
您是否编写了两个单元测试?一个值是 Null,一个值是 string.Empty?与 string.IsNullOrWhiteSpace() 类似吗? 最佳答案 是的,您通常希望测试所有可能的输入类别
抱歉,如果这是之前已经回答过的问题,我不确定要搜索什么。我有一些代码在执行单行代码之前有很多空/空检查。这很丑陋,我觉得可能有更好的方法来做到这一点。 例子: private XElement get
我是一名优秀的程序员,十分优秀!