【发布时间】:2013-01-08 17:55:07
【问题描述】:
我经常需要通过 publishStart、publishEnd、active 等字段来限制 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() 提供了上述 sn-p 的 3 行。
我怎么能这样做? 有没有更好的清理代码的方法?
【问题讨论】:
-
这些都在单独的表中,对吧?没有一个由上下文公开的表?我问是因为您在序言中指出属性位于单独的表中,而您在过滤器中仅使用一个上下文。如果他们都在同一张桌子上,这很容易,如果他们在不同的桌子上,它会极大地改变正确的答案。
-
在这种情况下,您需要致电
IsActive之前SingleOrDefault以便它可以在您只取一个之前过滤活动项目,除非只有一个具有该 ID 的一项。
标签: c# linq linq-to-sql extension-methods