c# - 使用 C# 将列/属性动态过滤到 EF 4.1 查询中

标签 c# linq entity-framework-4.1

我正在尝试使用 linq 在 C# 中创建一个通用的“搜索引擎”。我有一个简单的搜索引擎,其功能和外观如下所示。

var query = "joh smi";
var searchTerms = query.Split(new char[] { ' ' });
var numberOfTerms = searchTerms.Length;

var matches = from p in this.context.People
              from t in searchTerms
              where p.FirstName.Contains(t) ||
              p.LastName.Contains(t)
              group p by p into g
              where g.Count() == numberOfTerms
              select g.Key;

我希望它更通用,所以我可以这样调用它:

var matches = Search<Person>(dataset, query, p => p.FirstName, p => p.LastName);

我已经得到了以下信息,但它失败了,并显示“LINQ to Entities 不支持 LINQ 表达式节点类型‘Invoke’。” System.NotSupportedException。

static IEnumerable<T> Find<T>(IQueryable<T> items, string query,
                              params Func<T, string>[] properties)
{
    var terms = query.Split(' ');
    var numberOfParts = terms.Length;

    foreach (var prop in properties)
    {
        var transformed = items.SelectMany(item => terms, 
                (item, term) => new { term, item });

                                              // crashes due to this method call
        var filtered = transformed.Where(p => prop(p.item).Contains(p.term));
        items = filtered.Select(p => p.item);
    }

    return from i in items
           group i by i into g
           where g.Count() == numberOfParts
           select g.Key;
}

我确定它是可行的,只是必须有一种方法来编译 i => i.FirstNameExpression<Func<T, bool>> ,但我的 LINQ 专业知识到此为止。有人有什么想法吗?

最佳答案

您应该使用 Predicate Builder 来构造您的 Or 查询,例如:

var predicate = PredicateBuilder.False<T>();
foreach (var prop in properties)
{
    Func<T, string> currentProp = prop;
    predicate = predicate.Or (p => currentProp(p.item).Contains(p.term));
}
var result = items.Where(predicate );

关于c# - 使用 C# 将列/属性动态过滤到 EF 4.1 查询中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6499227/

相关文章:

c# - VS Code Omnisharp.MsBuild.Projectmanager 无法加载程序集 System.Numerics.Vectors 4.1.3.0

c# - 如何中断或退出 Linq 查询

c# - Entity Framework 4.1 代码优先外键 ID

c# - Entity Framework 4.1 - TPT 预加载 - "The ResultType of the specified expression is not compatible with the required type"

c# - ASP.NET 事件未在 <div> 标记中触发

c# - 如何在 C# 中使用 'do' ByVal

c# - 如何将复杂的 XML 转换为 .NET 类?

c# - 查询 "Memory"的 LINQ

c# - 没有foreach的Linq?

asp.net-mvc-3 - 在 MVC 中的应用程序级别持久保存数据库存储的查找数据的最佳实践