首页 / C# / c# – 通过System.Linq.Expressions.Expression创建表达式时,LINQ to Entities无法识别方法’Boolean HasFlag(System.Enum)’
c# – 通过System.Linq.Expressions.Expression创建表达式时,LINQ to Entities无法识别方法’Boolean HasFlag(System.Enum)’
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 通过System.Linq.Expressions.Expression创建表达式时,LINQ to Entities无法识别方法’Boolean HasFlag(System.Enum)’,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1749字,纯文字阅读大概需要3分钟。
内容图文
![c# – 通过System.Linq.Expressions.Expression创建表达式时,LINQ to Entities无法识别方法’Boolean HasFlag(System.Enum)’](/upload/InfoBanner/zyjiaocheng/811/c3f23623f82145d790e0f9cfce24c791.jpg)
我们使用System.Linq.Expressions.Expression构建自定义表达式,这些表达式应用于IQueryable的.Where().
我想要实现的是,在属性上应用.HasFlag()方法(introduced in EF 6.1),然后在.Where()表达式中使用该属性.
我有以下代码:
var memberExpression = propertyExpression as MemberExpression;
var targetType = memberExpression?.Type ?? typeof(decimal?);
var value = Enum.Parse(type, searchValue);
var hasFlagMethod = targetType.GetMethod(nameof(Enum.HasFlag));
var hasFlagExpression = Expression.Call(propertyExpression, hasFlagMethod, Expression.Convert(Expression.Constant(value), typeof(Enum)));
propertyExpression的值显示为{x.Type},hasFlagMethod显示为{Boolean HasFlag(System.Enum)},这对我来说都很好.
hasFlagExpression的值是{x.Type.HasFlag(Convert(Foo))},除了转换(Foo)部分外,对我来说看起来也完全没问题,但这样做是必要的,否则我会得到另一个Exception,它抱怨参数不能应用于此方法,因为它不是System.Enum.
当我们用这个.Where()枚举IQueryable时,我们得到以下异常:
NotSupportedException: LINQ to Entities does not recognize the method
'Boolean HasFlag(System.Enum)' method, and this method cannot
be translated into a store expression.
直接在IQueryable上调用它(我们也使用EF 6.1,它增加了对Enum.HasFlag()的支持),如
Entities.Where(x => x.Type.HasFlag(BarEnum.Foo));
但是这样称它不是一种选择,因为它需要对我们所有实体都是通用的. (我们根据数据表中的过滤列将那些.Where()条件放在一起)
解决方法:
代码中的HasFlag方法的MethodInfo与编译器生成的方法之间存在一个不易察觉的差异.前一种情况下的ReflectedType属性是typeof(YourEnum),而后者是typeof(Enum).两种情况下的DeclaringType属性都是同一个 – typeof(枚举),因此调试显示,但这足以打破EF查询转换器.
要解决此问题,只需更改即可
var hasFlagMethod = targetType.GetMethod(nameof(Enum.HasFlag));
至
var hasFlagMethod = typeof(Enum).GetMethod(nameof(Enum.HasFlag));
内容总结
以上是互联网集市为您收集整理的c# – 通过System.Linq.Expressions.Expression创建表达式时,LINQ to Entities无法识别方法’Boolean HasFlag(System.Enum)’全部内容,希望文章能够帮你解决c# – 通过System.Linq.Expressions.Expression创建表达式时,LINQ to Entities无法识别方法’Boolean HasFlag(System.Enum)’所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。