所以我在Entity Framework 4中使用CTP4代码的第一个功能创建了一个模型。这一切都很好。
我正在尝试向我的应用添加高级搜索功能。这种“高级搜索”功能只允许用户输入多个标准进行搜索。例如:
高级产品搜索
这将允许用户按产品名称进行搜索,并根据创建日期限制结果。
问题在于我不知道在任何单个搜索中将使用多少这些字段。然后如何构建我的实体框架查询?
我有an example描述如何为Entity Framework创建动态查询,但是这似乎不适用于我为Code First持久性创建的POCO类。
当约束数量未知时构造查询的最佳方法是什么?
答案 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));
所以,它似乎不是最好的解决方案,但肯定是一种方法。