gpt4 book ai didi

c# - 在 Dynamic LINQ 中使用 Contains 时,如何将动态类型转换为字符串?

转载 作者:行者123 更新时间:2023-11-30 12:29:12 24 4
gpt4 key购买 nike

我想使用动态 LINQ 查询来搜索类中所有属性中的一些文本。我正在使用以下函数来创建表达式。我将属性名称和搜索文本传递给该方法。 在该方法中,如果属性类型为 String,则它工作正常。如果属性类型是 int、DateTime、GUID。那么它就不起作用了。

正如我们所知,Contains 方法仅适用于元素数组或字符串。我认为属性的值应该类型转换为字符串。那么怎么做呢?带解释的解决方案是完整的帮助。

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

}

最佳答案

嗯,您可能知道不可能使用 ToString()在实体中。

所以接下来的问题是:如何将其他类型转换为字符串。

对于数值,您有SqlFunctions.StringConvert , 但它只有 double? 的重载和 decimal?

对于 DateTime,您可能会使用 SqlFunctions.StringConvert 找到一些东西申请后SqlFunctions.DatePart在你的 DateTime (这可能意味着至少 3 次调用 SqlFunctions.DatePart,年、月、日)

对于Guid,我认为没有办法直接做到。一种方法(在数据库级别,如果您使用 Sql Server)可能是有一个计算列。计算列可以存储 GUID 的 varchar 转换表示形式。也许有更好的方法。

无论如何,这里至少有一个适用于 integer 的示例以及string :

 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 时,如何将动态类型转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19315762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com