实体框架代码优先和搜索标准

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

以上是关于实体框架代码优先和搜索标准的主要内容,如果未能解决你的问题,请参考以下文章

调试代码优先的实体框架迁移代码

实体框架代码优先 - 孤立解决方案?

如何在实体框架代码优先方法中使用表值函数?

实体框架和代码优先开发

实体框架代码优先开发资源和文档

实体框架代码优先多对多不使用 GUID 加载相关实体