9

因此,我使用 CTP4 代码优先功能在 Entity Framework 4 中创建了一个模型。这一切都很好。

我正在尝试向我的应用程序添加高级搜索功能。这种“高级搜索”功能只允许用户输入多个搜索条件。例如:

高级产品搜索

  • 姓名
  • 开始日期
  • 结束日期

这将允许用户按产品名称进行搜索,并按创建日期限制结果。

问题是我不知道在任何单个搜索中将使用多少个这些字段。那么如何构造我的实体框架查询呢?

我有一个示例描述如何为实体框架创建动态查询,但这似乎不适用于我为代码优先持久性创建的 POCO 类。

当约束的数量未知时,构建查询的最佳方法是什么?

4

2 回答 2

20

因此,在解决这个问题几个小时后(以及我们朋友 Google 的一些帮助),我找到了一个可行的解决方案来解决我的问题。我创建了以下 Linq 表达式扩展:

using System;
using System.Linq;
using System.Linq.Expressions;

namespace MyCompany.MyApplication
{
    public static class LinqExtensions
    {
        public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate)
        {
            if (condition)
                return source.Where(predicate);
            else
                return source;
        }
    }
}

此扩展允许像这样创建 Linq 查询:

var products = context.Products.WhereIf(!String.IsNullOrEmpty(name), p => p.Name == name)
                               .WhereIf(startDate != null, p => p.CreatedDate >= startDate)
                               .WhereIf(endDate != null, p => p.CreatedDate <= endDate);

这允许每个 WhereIf 语句仅在满足提供的条件时才影响结果。该解决方案似乎有效,但我总是对新想法和/或建设性批评持开放态度。

于 2010-10-19T20:19:15.800 回答
0

约翰,

您的解决方案绝对很棒!但是,只是为了分享,我一直在使用上面的这种方法,直到我看到你的想法。

var items = context.Items.Where(t => t.Title.Contains(keyword) && !String.IsNullOrEmpty(keyword));

因此,这似乎不是最好的解决方案,但可以肯定它是一种解决方法。

于 2014-02-10T14:39:15.547 回答