实体框架代码优先和搜索标准
Posted
技术标签:
【中文标题】实体框架代码优先和搜索标准【英文标题】:Entity Framework Code First & Search Criteria 【发布时间】:2010-10-19 16:54:34 【问题描述】:所以我使用 CTP4 代码优先功能在 Entity Framework 4 中创建了一个模型。这一切都很好。
我正在尝试向我的应用程序添加高级搜索功能。这种“高级搜索”功能只允许用户输入多个搜索条件。例如:
高级产品搜索
姓名 开始日期 结束日期这将允许用户按产品名称进行搜索,并按创建日期限制结果。
问题是我不知道有多少这些字段将用于任何一次搜索。那么如何构造我的实体框架查询呢?
我有 an example 描述如何为实体框架创建动态查询,但这似乎不适用于我为 Code First 持久性创建的 POCO 类。
当约束数量未知时,构建查询的最佳方法是什么?
【问题讨论】:
【参考方案1】:因此,在解决这个问题几个小时后(以及我们的朋友 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 语句仅在满足提供的条件时才影响结果。该解决方案似乎有效,但我总是乐于接受新想法和/或建设性批评。
【讨论】:
我们可以使用内置 where().where() 但为什么有人要使用你的扩展?有什么特别之处?【参考方案2】:约翰,
您的解决方案绝对很棒!但是,只是为了分享,我一直在使用上面的这种方法,直到我看到你的想法。
var items = context.Items.Where(t => t.Title.Contains(keyword) && !String.IsNullOrEmpty(keyword));
所以,这似乎不是最好的解决方案,但肯定是一种解决方法。
【讨论】:
如果目标是使用 !String.IsNullOrEmpty() 防止错误,那么您应该将其放在包含 var 的 if 中,或者将其放在使用它的第一个位置。如果该值来自 [Required] 模型字段.. 它永远不会是 NULL 或 Empty以上是关于实体框架代码优先和搜索标准的主要内容,如果未能解决你的问题,请参考以下文章