C# 正在获取特定linq to sql表的名称
我正在使用LINQtoSQL操作和MS Access数据库 为了加快批量修改,我发现使用datacontext直接执行查询更有效,比如soC# 正在获取特定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
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