LINQ到实体的投射问题
我试图以通用方式过滤LINQ到实体的查询,但我一直收到错误。 这是一段代码:
private IQueryable FilterDeletedEntities(IQueryable entities) { if (typeof(IDeletable).IsAssignableFrom(typeof(T))) { var deletableEntities = (IQueryable)entities; deletableEntities = deletableEntities.Where(entity => !entity.Deleted); entities = (IQueryable)deletableEntities; } return entities; }
基本上我正在尝试过滤掉已删除的实体(即’已删除’字段为’true’),当且仅当实体是IDeletable时(即它具有’已删除’字段)。 问题是我无法将IQueryable 转换回IQueryable 。
有想法该怎么解决这个吗? 在你问之前:是的,这种方法必须是通用的。
提前致谢!
但是你可以使用Cast
来转换它。
entities = deletableEntities.Cast();
你也可以将它用于IDeletable,例如,
private IEnumerable FilterDeletedEntities (IQueryable entities) { if (typeof(IDeletable).IsAssignableFrom(typeof(T))) { return entities.ToList() .Cast() .Where( e => !e.Deleted ) .Cast(); } return entities.ToList(); }
通过这样做,我能够解决我的问题:
private IQueryable FilterDeletedEntities (IQueryable entities) { if (typeof(IDeletable).IsAssignableFrom(typeof(T))) { var deletableEntities = (IQueryable)entities; return deletableEntities.Where(entity => !entity.Deleted).Cast(); } return entities; }
感谢tvanfosson的灵感。
如果你可以假设没有人需要用没有实现IDeletable的T调用这个方法,你可以限制T:
private IQueryable FilterDeletedEntities (IQueryable entities) where T : IDeletable
作为奖励,您不需要投射任何东西或使用reflection来测试IDeletable。
- Ivona请求签名问题 – 签名不匹配(AWS签名版本4)
- RandomNumberGenerator与RNGCryptoServiceProvider
- 使用SerialPort禁用EOF(0x1A)
- 方法“ToString”没有重载需要1个参数
- 如何使用TagLib-Sharp从MP3文件中读取XingHeaders和VBRIHeaders
- 图表 – 放大以显示更精确的数据
- 如何通过ConfigurationManager写入User.Config文件?
- 从C#调用者中的非托管DLL捕获stdout
- 在WPF UserControl上使用Rx over事件,为什么当窗口最大化时控件会收到mousedown和mousemove?