Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在获取特定linq to sql表的名称_C#_Vb.net_Entity Framework_Linq To Sql - Fatal编程技术网

C# 正在获取特定linq to sql表的名称

C# 正在获取特定linq to sql表的名称,c#,vb.net,entity-framework,linq-to-sql,C#,Vb.net,Entity Framework,Linq To Sql,我正在使用LINQtoSQL操作和MS Access数据库 为了加快批量修改,我发现使用datacontext直接执行查询更有效,比如socontext.ExecutCommand(“从[MyTable];”删除)。为了提高效率,我想将其作为扩展方法,但我不知道如何从上下文检索表名 我知道我可以将表名作为硬编码字符串传递,例如: public static void DeleteAll(this Table<TEntity> MyTable) { string tableNa

我正在使用LINQtoSQL操作和MS Access数据库

为了加快批量修改,我发现使用datacontext直接执行查询更有效,比如so
context.ExecutCommand(“从[MyTable];”删除)
。为了提高效率,我想将其作为扩展方法,但我不知道如何从上下文检索表名

我知道我可以将表名作为硬编码字符串传递,例如:

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

    MyTable.Context.ExecuteCommand(string.Format("DELETE FROM [{0}];", tableName));
}
但无法找出如何检索
MyTables
中的实体类型,以便不必硬编码
.GetTable()
的参数并使其可用于我传入的任何表

用C#或VB回答都可以。谢谢

编辑


总结一下,我要寻找的是一种从表本身获取表的实体类型的方法。类似于
Context.MyTable.GetEntityType()
。。。如果能这么简单就好了。

我不确定这是否适用于EF,但我在Linq to Sql中使用了这种方法

您必须使用来自
System.Data.Linq.Mapping
命名空间的属性。如果打开包含任何Linq to Sql实体的定义的
*.designer.cs
文件,您将在类声明上方找到如下行:

[global::System.Data.Linq.Mapping.TableAttribute(Name="YourTableName")]
因此,LINQtoSQL中的每个实体类都标记有
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;
}
公共静态字符串GetTableName(此表为MyTable)
地点:班级
{
类型=类型(强度);
object[]temp=type.GetCustomAttributes(
typeof(System.Data.Linq.Mapping.TableAttribute),
正确的);
如果(温度长度==0)
返回null;
其他的
返回(temp[0]作为System.Data.Linq.Mapping.TableAttribute).Name;
}

由于我的表上没有属性,我需要获取实体名称,这是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;
    }
公共静态字符串GetTableName(此表为MyTable),其中tenty:class
{
string name=string.Empty;
类型;
对象[]属性;
类型=类型(张力);
attributes=type.GetCustomAttributes(typeof(TableAttribute),true);
如果(attributes.Length>0)
名称=((TableAttribute)属性[0])。名称;
如果(!string.IsNullOrEmpty(名称))
返回名称;
返回类型.名称;
}
这也应该有效:

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

谢谢,这确实有效。但在我的例子中,表上没有属性。我在设计器中手动创建类,只使用类名。有什么方法可以这样得到实体的类型吗?忘记我之前的评论吧。我看到了你是如何得到实体类型的,并且明白了该怎么做。我会将此标记为答案,并在下面发布我的修改版本。非常感谢@user643192如果
tenty
类的名称等于表的名称,那么它将与
typeof(tenty)一样简单。name
@user643192很高兴这对您有所帮助它非常简单,但我无法获得它,因为我正在编写的测试代码不在扩展方法中,所以我无法找到如何获得
tenty
:(尽管如此,您不需要编写那么长的
MyTable.Context.GetTable(type).ElementType.Name
。它实际上等于
typeof(tenty).Name
或在方法的上下文中,仅键入.Name如果
GetCustomAttributes
返回一个空数组,当您尝试在不检查
长度的情况下访问零索引元素时,可能会出现
indexoutofrange
异常。天哪,我太糟糕了…再次修改了它。现在它肯定应该是bul了let-proof.TEntity是什么?我的意思是我知道它想要什么,但我从哪里得到它?@msysmilu问题是如何获得数据类型/实体的db表名。因此,只需将TEntity替换为保存到数据库中的任何数据类型。谢谢@Rolf,这样做了,并获得了“dbo.Tablename”,它在SQL语句中完成了这项工作
MyTable.Context.Mapping.GetTable(typeof(TEntity)).TableName