获取特定linq到sql表的名称

时间:2013-02-15 00:49:02

标签: c# vb.net entity-framework linq-to-sql

我正在使用Linq to SQL来操作和MS Access数据库。

为了加快批量修改,我发现使用datacontext直接执行查询更有效,就像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()这样的东西......如果只是那么容易的话。

3 个答案:

答案 0 :(得分:7)

我不确定这是否适用于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;
}

答案 1 :(得分:2)

这也应该有效:

MyTable.Context.Mapping.GetTable(typeof(TEntity)).TableName

答案 2 :(得分: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;
    }