gpt4 book ai didi

c# - 搜索所有字段

转载 作者:行者123 更新时间:2023-12-02 21:11:49 26 4
gpt4 key购买 nike

我有一个实体,设备,我希望用户能够搜索所有字段(理想情况下是所有字段,我只处理文本)。我怎样才能做到这一点而无需明确执行

devices.Where(d => 
d.prop1.Contains(searchterm) ||
d.prop2.Contains(searchterm))

但这必须发生在数据库上,而不是在返回的对象中。

编辑

我已经尝试过以下评论之一,但没有成功

var stringProperties = typeof(Device)
.GetProperties()
.Where(prop => prop.PropertyType == deviceSettingValue.GetType());
var matches = devices
.Where(device => stringProperties.Any(prop => prop.GetValue(device, null) == deviceSettingValue));
var fullmatches = matches.ToList();

错误是

Unable to create a constant value of type 'System.Reflection.PropertyInfo'. Only primitive types or enumeration types are supported in this context.

最佳答案

您可以根据实体的属性动态构建表达式,如下所示:

public IQueryable<T> CreateSearchQuery<T>(DbSet<T> db_set , string value) where T:class
{
IQueryable<T> query = db_set;

List<Expression> expressions = new List<Expression>();

ParameterExpression parameter = Expression.Parameter(typeof (T), "p");

MethodInfo contains_method = typeof(string).GetMethod("Contains", new[] { typeof(string) });

foreach (PropertyInfo prop in typeof(T).GetProperties().Where(x => x.PropertyType == typeof (string)))
{
MemberExpression member_expression = Expression.PropertyOrField(parameter, prop.Name);

ConstantExpression value_expression = Expression.Constant(value, typeof(string));

MethodCallExpression contains_expression = Expression.Call(member_expression, contains_method, value_expression);

expressions.Add(contains_expression);
}

if (expressions.Count == 0)
return query;

Expression or_expression = expressions[0];

for (int i = 1; i < expressions.Count; i++)
{
or_expression = Expression.OrElse(or_expression, expressions[i]);
}

Expression<Func<T, bool>> expression = Expression.Lambda<Func<T, bool>>(
or_expression, parameter);

return query.Where(expression);
}

此方法接受 DbSet 和您要搜索的值。它循环遍历 string 类型的属性,并为每个属性创建一个“contains”表达式(例如 p => p.Name.Contains("test") )。

然后它使用 OR 表达式聚合表达式。

您可以像这样使用此方法:

var query = CreateSearchQuery(context.Devices, "name");

var result = query.ToList();

关于c# - 搜索所有字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33035830/

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