3

基本的に、私はこれを行うためのそれほどひどい方法を見つけようとしています:

foreach (var k in someList)
{
    try
    {
        var temp = Database.Set(k.GetType()).Local;
        newList.Add(k);
    }
    catch (InvalidOperationException)
    {

    }
}

DatabaseDbContextのモデルのインスタンスです。

someListはオブジェクトのコレクションであり、エンティティモデルの一部であるものと、そうでないものがあります。newListモデルの一部であるオブジェクトのみを含む新しいリスト()を作成したいと思います。のオブジェクトsomeListは任意のタイプにすることができます(私の場合、これらの1つは、List<string>明らかに私の基になるデータベースとは何の関係もありません)。

からのInvalidOperationExceptionオブジェクトsomeListがエンティティモデルの一部ではない場合に発生します。これを行うことで、私は欲しいものを手に入れることができますが、それはハックのようです。より良い解決策を探しています。

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 に答える