8

Linq to SQL を使用して MS Access データベースを操作しています。

バッチ変更を高速化するには、データコンテキストを使用してクエリを直接実行する方が効率的であることがわかりましたcontext.ExecutCommand("DELETE FROM [MyTable];")。効率化のためにこれを拡張メソッドにしたいのですが、コンテキストからテーブル名を取得する方法がわかりません...

テーブル名を次のようなハードコードされた文字列として渡すことができることはわかっています。

public static void DeleteAll(this Table<TEntity> MyTable)
{
    string tableName = // retrieve MyTable's name

    MyTable.Context.ExecuteCommand(string.Format("DELETE FROM [{0}];", tableName));
}

テーブル名を取得する方法はありますが、これを機能させるには助けが必要です。これまでのところ、私は持っています:

var tableName = dc.MyTables.Context.GetTable(typeof(MyTable)).ElementType.Name;

しかし、エンティティのタイプを取得する方法がわかりません。これMyTablesにより、引数をハードコーディングする必要がなくなり、.GetTable()渡したテーブルでこれを使用できるようになります。

C# または VB での回答は問題ありません。ありがとう。

編集

私が探しているものを要約すると、テーブル自体からテーブルのエンティティ型を取得する方法です。みたいなContext.MyTable.GetEntityType()... そんなに簡単だったらいいのに。

4

3 に答える 3

9

これが EF で機能するかどうかはわかりませんが、Linq to Sql でこのアプローチを使用しています。

System.Data.Linq.Mapping名前空間の属性を使用する必要があります。Linq to Sql エンティティの定義を含むファイルを開く*.designer.csと、クラスの宣言の上に次のような行があります。

[global::System.Data.Linq.Mapping.TableAttribute(Name="YourTableName")]

したがって、Linq to Sql の各エンティティ クラスはTableAttribute属性でマークされ、そのNameプロパティには必要な名前が含まれています。これを使用することがあります:

public static string GetTableName<TEntity>(this Table<TEntity> MyTable) 
                            where TEntity : class
{
    Type type = typeof(TEntity);
    object[] temp = type.GetCustomAttributes(
                           typeof(System.Data.Linq.Mapping.TableAttribute), 
                           true);
    if (temp.Length == 0)
        return null;
    else
        return (temp[0] as System.Data.Linq.Mapping.TableAttribute).Name;
}
于 2013-02-15T01:06:12.773 に答える
2

これも機能するはずです:

MyTable.Context.Mapping.GetTable(typeof(TEntity)).TableName
于 2013-07-30T14:17:32.170 に答える
0

テーブルに属性がないため、エンティティ名を取得する必要があります。これは、この場合、Linq to SQL が使用するものです。したがって、Konstantin Vasilikov の回答に基づいて、拡張メソッドは次のようになります。

    public static string GetTableName<TEntity>(this Table<TEntity> MyTable) where TEntity : class
    {
        string name = string.Empty;
        Type type;
        object[] attributes;

        type = typeof(TEntity);
        attributes = type.GetCustomAttributes(typeof(TableAttribute), true);

        if (attributes.Length > 0)
            name = ((TableAttribute)attributes[0]).Name;
            if (!string.IsNullOrEmpty(name))
                return name;

         return type.Name;
    }
于 2013-02-15T01:39:15.340 に答える