エンティティタイプに対してリフレクションを試すことができます。私が知る限り、生成されたすべてのプロパティは、対応するColumnAttribute
がある場合、テーブルの列に対応します。あなたはこれを試すことができます:メタモデルのコンラッドの使用を見ての光で
public static List<string> GetColumnNames<TEntity>(Table<TEntity> table)
where TEntity : class
{
return GetColumnNames(typeof(TEntity));
}
public static List<string> GetColumnNames(DataContext context, string functionName)
{
var retType = context.GetType().GetMethod(functionName).ReturnType;
System.Diagnostics.Debug.Assert(retType.Name == "ISingleResult`1");
return GetColumnNames(retType.GetGenericArguments().Single());
}
public static List<string> GetColumnNames(Type entityType)
{
return (from p in entityType.GetProperties()
let columnAttribute = p.GetCustomAttributes(false)
.OfType<System.Data.Linq.Mapping.ColumnAttribute>()
.SingleOrDefault()
where columnAttribute != null
select columnAttribute.Name ?? p.Name)
.ToList();
}
// usage:
// from a function/procedure name
var names1 = GetColumnNames(DataContext, "GetTable");
// or by entity type directly (the return type of the function/procedure)
var names2 = GetColumnNames(typeof(GetTable));
が、私はこの思い付きました。関連付け(LINQ to SQLによって追加)は、テーブルから列名を取得するためにフィルタリングする必要があります。
public static List<string> GetColumnNames<TEntity>(Table<TEntity> table)
where TEntity : class
{
return new System.Data.Linq.Mapping.AttributeMappingSource()
.GetModel(table.Context.GetType())
.GetTable(typeof(TEntity))
.RowType
.DataMembers
.Where(dm => !dm.IsAssociation)
.Select(dm => dm.MappedName)
.ToList();
}
public static List<string> GetColumnNamesMeta(DataContext context, string functionName)
{
var type = context.GetType();
return new System.Data.Linq.Mapping.AttributeMappingSource()
.GetModel(type)
.GetFunction(type.GetMethod(functionName))
.ResultRowTypes
.SelectMany(rrt => rrt.DataMembers
.Where(dm => !dm.IsAssociation)
.Select(dm => dm.MappedName))
.ToList();
}
列名を意味しますか?ストアドプロシージャを呼び出すコードを投稿できますか? – Oded
可能な繰り返し:http://stackoverflow.com/questions/187357/linq-to-sql-datatable-rows0columnname-equivalent – apros
@Odedコードを追加しました。はい、私は列名を意味しました。 –