You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core中实现适配全数据库实体的通用搜索方法遇类型转换错误如何解决

问题根源

你当前代码的逻辑默认传入的objList中每个元素都是Dictionary<string, object>类型,但_service.GetAll(eo)返回的是数据库实体类的集合(比如List<User>、List<Order>这类自定义实体),不是字典集合,因此循环里的强转操作直接失败,抛出类型转换错误。
同时你当前的代码仅对DateTime类型的字段做了检索匹配,其他类型的字段会被直接忽略,也不符合通用搜索的需求。

可行实现方案

以下两种方案可以根据你的业务需求选择:

方案1:最小改动,先转字典再调用原有方法

不需要修改你现有的HandleSearch代码,新增一个实体转字典的通用方法即可:

public static Dictionary<string, object> EntityToDictionary<T>(this T entity) where T : class
{
    return entity.GetType()
        .GetProperties()
        .ToDictionary(p => p.Name, p => p.GetValue(entity, null));
}

调用时先把实体集合转成字典集合再传入:

var x = _service.GetAll(eo);
var dictList = x.Select(e => e.EntityToDictionary()).ToList();
var c = GeaUtility.HandleSearch(dictList, "29/02");

方案2:重构为通用泛型方法,直接支持实体类

不需要提前做类型转换,方法内部通过反射读取实体属性值,返回值直接为原实体类型集合,后续操作更方便:

public static List<T> HandleSearch<T>(IEnumerable<T> objList, string searchText) where T : class
{
    List<T> returnList = new List<T>();
    if (objList == null || string.IsNullOrWhiteSpace(searchText))
        return returnList;
    
    searchText = searchText.ToLower();
    foreach (var obj in objList)
    {
        var properties = obj.GetType().GetProperties();
        foreach (var prop in properties)
        {
            var value = prop.GetValue(obj, null);
            if (value == null) continue;
            
            if (value is DateTime dateValue)
            {
                if (dateValue.ToString("dd/MM/yyyy HH:mm:ss").Contains(searchText) 
                    || dateValue.ToString().ToLower().Contains(searchText))
                {
                    returnList.Add(obj);
                    break;
                }
            }
            else
            {
                if (value.ToString().ToLower().Contains(searchText))
                {
                    returnList.Add(obj);
                    break;
                }
            }
        }
    }
    return returnList;
}

调用时直接传入实体集合即可:

var x = _service.GetAll(eo);
var c = GeaUtility.HandleSearch(x, "29/02");
优化建议
  • 如果数据量较大,建议直接在数据库查询层面做模糊匹配,不要拉取全量数据到内存再过滤,性能损耗会小很多
  • 可以根据业务需求增加自定义属性标记,支持指定部分字段参与检索,避免无意义的字段匹配

内容的提问来源于stack exchange,提问作者loreeemartiii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:36:05