基本上我正试图找到一种不那么糟糕的方法来做到这一点:
foreach (var k in someList)
{
try
{
var temp = Database.Set(k.GetType()).Local;
newList.Add(k);
}
catch (InvalidOperationException)
{
}
}
Database
是我的模型的DbContext
个实例。
someList
是对象的集合,有些是实体模型的一部分,有些则不是。我想创建一个新列表(newList
),它只包含作为模型一部分的对象。 someList
中的对象可以是任何类型(在我的情况下,其中一个是List<string>
,这显然与我的底层数据库无关。)
当来自InvalidOperationException
的对象不是实体模型的一部分时,会引发someList
。通过这样做我得到我想要的东西,但它似乎是一个黑客。我正在寻找更好的解决方案。
答案 0 :(得分:1)
这似乎不是直接的答案,但您可以只使用Marker界面,而不是尝试使用DBContext
实例进行检查。然后,您可以直接查看,而无需使用DBContext
。例如,
public interface IEntity
{
}
public clas SomeEntity : IEntity
{
... some properties
}
另外,作为旁注,我想知道如何在同一个List中存储不同类型的实例。
答案 1 :(得分:0)
我正在添加此答案,以便找到此问题的任何人都能看到我是如何解决它的。话虽如此,真正的解决方案是避免在同一集合中使用实体和非实体(如对原始问题的评论中所述)。
要过滤集合someList
,您需要知道哪些类型是实体,哪些不是。为此,我从DbContext
的属性中构建了一个类型列表。
types = (from t in typeof (Entities).GetProperties()
where t.PropertyType.IsGenericType
where
t.PropertyType.GetGenericTypeDefinition() ==
typeof (DbSet<object>).GetGenericTypeDefinition()
select t.PropertyType.GetGenericArguments()[0]).Distinct();
Entities
是表示我的数据库模型的类(它继承自DbContext
)。
这可以通过在DbSet<T>
中找到所有Entities
属性,然后构建所有T
类型的集合来实现。这些类型中的每一种都代表一种实体类型。
要过滤someList
,我只需检查每个成员的类型是否包含在集合types
中。