【问题标题】:Text search on Generic type in Entity Framework实体框架中通用类型的文本搜索
【发布时间】:2012-01-27 16:19:06
【问题描述】:

我正在尝试实现对数据库表的文本搜索。我有一个通用存储库,我真的不想为我可能想要公开的每个模型创建派生存储库,因为数据库中有很多。

所以我遇到困难的代码如下:

var props = typeof(T).GetProperties()
    .Where(p => p.PropertyType == typeof(string));

IEnumerable<T> searched = null;
if (!string.IsNullOrWhiteSpace(searchTerm))
    searched = sorted.Where(c => props
        .Select(p => (string)p.GetValue(c, null))
        .Select(v => v.Contains(searchTerm))
        .Contains(true));

我将通过一些反思获得的 PropertyInfo 集合提供给它。可能不是一个高性能的想法,但我还没有想到更好的方法。因此,这些可能是字符串类型的所有属性(搜索表中的所有字符串),或者它可能会拉取模型中具有自定义 Searchable 属性的某些属性。

我得到的运行时异常是:

NotSupportedException:无法创建“System.Reflection.PropertyInfo”类型的常量值。只有原始类型('例如 在此上下文中支持 Int32、String 和 Guid')。

我可以看到我正在使用反射,但不太确定究竟是什么导致了这里的异常。如果有人能指出这一点,那将不胜感激,但如果有人能提出更好的方法来做到这一点,那就太棒了。提前致谢!

【问题讨论】:

    标签: c# entity-framework generics reflection


    【解决方案1】:

    问题是当执行 LINQ 查询时,它试图构造一个 SQL 查询以在数据库上执行。异常消息表明只能在 LINQ 查询中使用原始类型,因为这些是唯一可以成功转换为 SQL 查询的类型。

    希望能解决您的问题,您只需确保在使用非原始类型扩展 LINQ 查询之前执行数据库 SQL 查询。

    我猜你代码sn-p中的sorted变量是一个LINQ查询,所以调用sorted.AsEnumerable()对数据库执行SQL查询,然后你就可以执行搜索功能了。

    searched = sorted.AsEnumerable()
                     .Where(c => props.Select(p => (string)p.GetValue(c, null))
                                      .Any(v => v.Contains(searchTerm)));
    

    【讨论】:

    • 感谢您的回答。你对这个问题是正确的,但解决方案并不完全是我所追求的。 where 子句中的反射是为了过滤数据库中的列。我真正需要的是替代反射来做到这一点。都投了赞成票。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多