实体框架代码第一&搜索条件

时间:2010-10-19 16:54:34

标签: entity-framework entity-framework-4 code-first

所以我在Entity Framework 4中使用CTP4代码的第一个功能创建了一个模型。这一切都很好。

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

高级产品搜索

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

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

问题在于我不知道在任何单个搜索中将使用多少这些字段。然后如何构建我的实体框架查询?

我有an example描述如何为Entity Framework创建动态查询,但是这似乎不适用于我为Code First持久性创建的POCO类。

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

2 个答案:

答案 0 :(得分:20)

所以经过几个小时的工作来解决这个问题(以及我们的朋友谷歌的一些帮助),我找到了一个可行的解决方案来解决我的问题。我创建了以下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语句仅在满足提供的条件时影响结果。解决方案似乎有效,但我总是乐于接受新的想法和/或建设性的批评。

答案 1 :(得分:0)

约翰,

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

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

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