c# - Linq扩展方法

标签 c# linq linq-to-sql extension-methods

我经常需要通过 publishStartpublishEndactive 等字段来限制 SELECT

我在几个不同的表中有这些字段。所以只应选择行,即

a: active == true;
b: publishStart < now;
c: publishEnd > now;

所以,例如:

db.myTable.SingleOrDefault(a => (a.ID == _theID 
          //now the active and start-end part:            
                      && ((a.publishEnd > DateTime.Now) || (a.publishEnd == null))
                      && ((a.publishStart <= DateTime.Now) || (a.publishStart == null))
                      && a.active == true));

这有点冗长,所以我想知道是否可以创建一个(扩展?)方法,例如:

db.myTable.SingleOrDefault(a => (a.ID == _theID).isActive()

其中 isActive() 提供了上述代码段的 3 行。

我该怎么做? 有没有更好的方法来清理代码?

最佳答案

要定义扩展,您需要一个静态类。你可以把它放在你喜欢的任何命名空间中,只记得将它包含在你的使用中。

public static class Extensions
{
    public static IQueryable<T> Active<T>(this IQueryable<T> source)
        where T : YourEntityType
    {
        return source.Where(a => ((a.publishEnd > DateTime.Now) || (a.publishEnd == null))
                          && ((a.publishStart <= DateTime.Now) || (a.publishStart == null))
                          && a.active == true);
    }
}

注意 YourEntityType 在那里。这用于确保该方法知道 publishStartpublishEndactive 的存在。这应该是实现这些字段的类或定义它们的契约(接口(interface))。

然后你可以这样调用它:

var item = db.myTable.Active().SingleOrDefault(...);

更多关于扩展方法的信息:http://msdn.microsoft.com/en-us/library/bb383977.aspx


由于到处都有很多评论,我将在这里添加一个接口(interface)解决方案的简要说明......

问题中不清楚这三个过滤字段是否有通用实现或定义它们的接口(interface)。如果不是,要使上述工作正常,您将不会:

  1. 实现这些字段的基类。在这种情况下,您可以将 YourEntityType 替换为 YourBaseEntityType
  2. 定义字段的接口(interface)。在这种情况下,您需要让您的类实现这些字段。如果类是自动生成的(例如首先是 Entity Framework 模型/数据库),那么您可以实现部分类,让它们实现接口(interface)。在这种情况下,您可以将 YourEntityType 替换为 IYourContract

关于c# - Linq扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14221143/

相关文章:

c# - MVC2 与 mySQL 和 LINQ to SQL

c# - "A cycle was detected in the set of changes"尝试向数据库添加循环链表时

c# - 什么使 LINQ 关联成为 EntitySet<table>?

c# - 解析文本并保存在内存中c#

linq - 使用 LINQ/ Entity Framework 以编程方式链接 OrderBy/ThenBy

linq - 将 DefaultExpression 绑定(bind)到 Linq-to-Entities 查询中的属性

c# - Linq WHERE EF.Functions.Like - 为什么直接属性有效而反射无效?

c# - 为什么在 EF Core 中没有一种简单的方法来定义多对多关系?

c# - 需要多个声音输出到多个扬声器

c# - 在 C# 中,对引用类型执行成功的转换操作最终会在堆上创建一个新的存储位置