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));
}

我有一些方法可以获取表名,但需要一些帮助才能使 thsi 正常工作。到目前为止,我有:

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命名空间中的属性。如果您打开*.designer.cs包含任何 Linq to Sql 实体定义的文件,您会在类的声明上方找到这样的一行:

[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 Vasilicov 的回答,扩展方法变为:

    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 回答