我让代码自己说话:IQueryable扩展方法的流利语法?
public interface ISoftDeletable {
bool IsDeleted {get; set;}
}
public static class Extensions {
public IQueryable<T> Active<T>(this IQueryable<T> q) where T : ISoftDeletable {
return q.Where(t => !t.IsDeleted);
}
}
public partial class Thing : ISoftDeletable {
...
}
...
var query = from tc in db.ThingContainers
where tc.Things.Active().Any(t => t.SatisfiesOtherCondition)
select new { ... }; // throws System.NotSupportedException
的错误是:
LINQ到实体无法识别方法“System.Collections.Generic.IQueryable`1 [事物] ActiveThing'方法,并且此方法不能转换为商店表达式。
你的想法:我想一口流利的一种表达这个的,这样对任何ISoftDeletable
我可以用一个简单的,可重用的代码上“其中”条款补充方式。这里的例子不起作用,因为Linq2Entities不知道如何处理我的Active()
方法。
我在这里给出的例子是一个简单的例子,但在我的真实代码中,Active()
扩展包含更复杂的一组条件,我不想复制粘贴遍及我的代码。
有什么建议吗?
你还没有说*你得到的例外是什么,这使得它很难帮助你。我希望你迄今所做的一切都很好 - 但更复杂的例子不会,例如在连接中使用'Active'。 –
@JonSkeet - 添加错误消息。但是,是的,你是对的,我的实际使用确实涉及到一个加入。 –
并且您是否使用简单的代码复制了该错误?我怀疑没有 - 如果有代码*会重现错误,这将会很有用。 –