【问题标题】:LinqToSQL - Cast IQueryable object at runtime?LinqToSQL - 在运行时投射 IQueryable 对象?
【发布时间】:2009-06-22 22:38:54
【问题描述】:

鉴于此:

var query = context.GetTable<T>();

其中“T”是传递给方法的通用实体,

我想做这样的事情:

if(typeof(TEntity) is IEntitySoftDeletable)
  query = query.Cast<IEntitySoftDeletable>.Where(ent => !ent.IsDeleted);
}

这可能吗?

目前它告诉我不能这样投射。

我意识到我可以在类或方法级别强制参数“T”成为 IEntitySoftDeletable,但我试图避免这种情况,并通过同一方法提供更大的灵活性。

【问题讨论】:

  • T 是否实现了 IEntitySoftDeletable ?
  • 并不总是...T 可以是任意数量的类型,其中一些实现了 IEntitySoftDeletable。我想要的是将谓词附加到可查询的 if T 是 IEntitySoftDeletable。我试图避免的是这种单独的行为需要重载。

标签: linq-to-sql


【解决方案1】:

不确定我是否完全理解您想要的,但这会起作用吗?

query.OfType<IEntitySoftDeletable>().Where(ent => !ent.IsDeleted); //OfType will only give the ones that are IEntitySoftDelteable

【讨论】:

  • 同样的问题。它说它不能将“T”转换为“IEntitySoftDeletable”。我有一个接受“T”的类,其中 T 没有约束。因此,当我得到“T”类型的可查询时,它不是 IEntityQueryable,但它“可能”是。我想要做的是在运行时检查它是否是,如果是,检查 IsDeleted 的值。您的方法允许我检查 IsDeleted,但无法将可查询的类型从“T”类型转换为“IEntitySoftDeletable”。我想我搞砸了,基本上必须限制过载。
  • 哦,等等,对不起,我脑子里放了个屁。你的方法会奏效。我只是不能将它返回到同一个查询变量“duh”中。我必须声明一个新查询。
【解决方案2】:

您可以使用

测试接口
obj.GetType().GetInterface("IEntitySoftDelete") == null

我认为这应该可以满足您的需求...只需确保添加一个 using for System.Reflection。

【讨论】:

  • 我无法确定 obj 是否为 IEntitySoftDeletable,我无法将 IQueryable 转换为 IQueryable。我能做到的唯一方法是在类或方法级别将“T”限制为 IEntitySoftDeletable。
猜你喜欢
  • 2015-01-10
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多