c# - 如何在 LINQ 查询中指定自定义方法(C# Entity Framework )

标签 c# linq entity-framework iqueryable

我定义了一个父类(super class)“Validity”,它定义了对象“有效”的时间跨度 (ValidFrom/ValidTo)。它还定义了一个针对给定时间戳返回 true 的函数,当且仅当(=if and only if)一个(派生的)对象此时有效。

public class Validity
{
    public int ValidityID { get; set; }

    public DateTime? ValidFrom { get; set; }
    public DateTime? ValidTo { get; set; }

    bool isValidAt(DateTime time)
    {
        return (ValidFrom == null || ValidFrom >= time)
            && (ValidTo == null || ValidTo < time);
    }
}

现在我想编写一些函数来检查 LINQ 查询中的 isValidAt。我想这可以通过 IQueriable 实现,但我不知道如何...... 以下代码片段是我希望以某种方式“工作”的代码(尤其是 where n.isValidAt(t) )。那么,如何实现这一目标呢?

public class Node : Validity {
    public int NodeID { get; set; }

    public static getFirstNode(DateTime t)
    {
        MyContext db = new MyContext();
        var items = from n in db.Nodes
                     where n.isValidAt(t)
                     orderby n.NodeID descending
                     select n;
        return items.FirstOrDefault<Node>();
    }
}

--- 工作解决方案 ---

我需要稍微调整一下 Zaid Masud 的解决方案,才能让它发挥作用。请注意,我必须删除 this在参数列表中(现在方法定义是 public static IQueryable<T> isValidAt<T>(IQueryable<T> query, DateTime time) where T : Validity )。这是源代码:

public class Validity
{
    public int ValidityID { get; set; }

    public DateTime? ValidFrom { get; set; }
    public DateTime? ValidTo { get; set; }

    public static IQueryable<T> isValidAt<T>(IQueryable<T> query, DateTime time) where T : Validity
    {
        return query.Where<T>(c => (c.ValidFrom == null || c.ValidFrom >= time)
            && (c.ValidTo == null || c.ValidTo < time));
    }
}

最佳答案

您需要将您的 bool isValidAt(DateTime time) 方法声明为 protected ,以便派生类可以访问它:

protected bool IsValidAt(DateTime time)

但是,在您完成此编译后,我怀疑您的 LINQ to SQL 提供程序是否能够将查询转换为 SQL。您可能需要将逻辑嵌入到 LINQ 查询中并编写如下内容:

var items = from n in db.Nodes
            where (n.ValidFrom == null || n.ValidFrom >= t) && (n.ValidTo == null || n.ValidTo < t)
            orderby n.NodeID descending
            select n;

这会起作用,但更好的替代方法是创建以下类型的扩展方法:

public static class ValidityExtensions
{
    public static IQueryable<T> Valid<T>(this IQueryable<T> validities, DateTime time) where T : Validity
    {
        return validities.Where(v => (v.ValidFrom == null || ValidFrom >= time) && (v.ValidTo == null || v.ValidTo < time));
    }
}

现在您可以按如下方式使用它:

var items = from n in db.Nodes.Valid(time)
            orderby n.NodeID descending
            select n;

关于c# - 如何在 LINQ 查询中指定自定义方法(C# Entity Framework ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12411728/

相关文章:

mysql - asp.net Identity 2.0的Extent用户表

c# - 将 SQL 日期转换为 dd-mmmm-yyyy C#

c# - 使用 MsiGetProductInfo 检查是否安装了 Microsoft Word

c# - 3D 图形 - 矩阵数学不起作用

c# - 使用 linq 按字母顺序对 TreeView 进行排序

c# - 图像 GDI+ 错误 c#

c# - 我如何使用 CreatedDate 位于 Date1var 和 Date2var 之间的 where 子句编写此代码?

c# - 使用可选参数创建 Type 实例的 Linq 表达式?

c# - 在列表中搜索数组或列表

.net - Entity Framework - 混合模型优先和数据库优先方法?