我已经定义了一个超类“有效性”,它定义了一个对象是“有效”的时间跨度(ValidFrom / ValidTo)。它还定义了一个函数,该函数对于给定的时间戳返回 true,当且仅当(当且仅当)一个(派生的)对象在此时有效。
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));
}
}