gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:02:51 25 4
gpt4 key购买 nike

我定义了一个父类(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com