c# – 如何在Dynamic LINQ中使用Contains时动态键入Cast到字符串?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何在Dynamic LINQ中使用Contains时动态键入Cast到字符串?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2552字,纯文字阅读大概需要4分钟。
内容图文
![c# – 如何在Dynamic LINQ中使用Contains时动态键入Cast到字符串?](/upload/InfoBanner/zyjiaocheng/778/035b6e647c51461cb157c3ffc4d357a5.jpg)
我想使用动态LINQ查询来搜索类中所有属性中的一些文本.我正在使用以下函数来创建表达式.我正在将属性名称和搜索文本传递给方法.
在该方法中,如果属性类型是String,那么它工作正常.如果属性类型是int,DateTime,GUID.那它不起作用.
我们知道仅包含元素数组或字符串的方法.我认为属性的值应该输入到字符串.那怎么办呢?解释与解释是完整的帮助.
我收集了this的代码.
public static Expression<Func<T, bool>> ContainsExp<T>(string propertyName, string contains)
{
var parameterExp = Expression.Parameter(typeof(T), "type");
var propertyExp = Expression.Property(parameterExp, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var someValue = Expression.Constant(contains, typeof(string));
var containsMethodExp = Expression.Call(propertyExp, method, someValue);
return Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);
}
解决方法:
好吧,你可能知道在linq中对实体使用ToString()是不可能的.
所以以下问题是:如何将其他类型转换为字符串.
对于数值,你有SqlFunctions.StringConvert,但它只有double的重载?和十进制?
对于DateTime,你可以在你的DateTime上应用SqlFunctions.DatePart后找到一些使用SqlFunctions.StringConvert的东西(这可能意味着至少3次调用SqlFunctions.DatePart,年,月,日)
对于Guid,我认为没有办法直接做到这一点.一种方法(在db级别,如果你使用Sql Server)可能是一个Computed列.计算列可以存储GUID的varchar转换表示.也许有更好的方法.
无论如何,这里至少有一个样本应该适用于整数和字符串:
public static Expression<Func<T, bool>> ContainsExp<T>(string propertyName, string contains)
{
//first, get the type of your property
var propertyType = typeof(T).GetProperty(propertyName).PropertyType;
//no change
var parameterExp = Expression.Parameter(typeof (T), "type");
Expression propertyExp = Expression.Property(parameterExp, propertyName);
//if property's type is int
if (propertyType == typeof (int))
{
//convert your Expression to a nullable double (or nullable decimal),
//so that you can use SqlFunctions.StringConvert
propertyExp = Expression.Convert(propertyExp, typeof (double?));
//get the SqlFunctions.StringConvert method for nullable double
var stringConvertMethod = typeof (SqlFunctions).GetMethod("StringConvert", new[] {typeof (double?)});
//call StringConvert on your converted expression
propertyExp = Expression.Call(stringConvertMethod , propertyExp);
}
//no change
var method = typeof (string).GetMethod("Contains", new[] {typeof (string)});
var someValue = Expression.Constant(contains, typeof (string));
var containsMethodExp = Expression.Call(propertyExp, method, someValue);
return Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);
}
内容总结
以上是互联网集市为您收集整理的c# – 如何在Dynamic LINQ中使用Contains时动态键入Cast到字符串?全部内容,希望文章能够帮你解决c# – 如何在Dynamic LINQ中使用Contains时动态键入Cast到字符串?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。