3

本质上,我试图找到一种不那么糟糕的方法来做到这一点:

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通过这样做,我得到了我想要的东西,但是这似乎是一个 hack。我正在寻找更好的解决方案。

4

2 回答 2

1

这似乎不是一个直接的答案,但DBContext您可以只使用标记接口,而不是尝试使用实例进行检查。然后您可以直接检查,而无需使用DBContext. 例如,

public interface IEntity
{
}

public clas SomeEntity : IEntity
{
    ... some properties
}

另外,作为旁注,我想知道您如何能够将不同类型的实例存储在同一个列表中。

于 2013-02-06T08:57:41.950 回答
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

于 2013-02-07T15:38:11.257 回答