LINQ到SQL获取类型和长度

本文关键字:取类型 获取 SQL LINQ | 更新日期: 2023-09-27 18:10:16

我的任务是从DBML中查找特定列的Type和Length。

我想在DataContext, TableName和ColumnName中传递,以返回我正在寻找的值。我发现了下面这个类似的例子,但是它没有返回任何东西:

http://www.codeproject.com/Articles/27392/Using-the-LINQ-ColumnAttribute-to-Get-Field-Length

然而,我可能不正确地实现了这个。对于obj参数,我应该在数据上下文中传递吗?我发现,当我试图加载info(对象数组)时,我一无所获…

    public static int GetLengthLimit(object obj, string field)
    {
        int dblenint = 0;   // default value = we can't determine the length
        Type type = obj.GetType();
        PropertyInfo prop = type.GetProperty(field);

        // Find the Linq 'Column' attribute
        // e.g. [Column(Storage="_FileName", DbType="NChar(256) NOT NULL", CanBeNull=false)]
        object[] info = prop.GetCustomAttributes(typeof(ColumnAttribute), true);
        // Assume there is just one
        if (info.Length == 1)
        {
            ColumnAttribute ca = (ColumnAttribute)info[0];
            string dbtype = ca.DbType;
            if (dbtype.StartsWith("NChar") || dbtype.StartsWith("NVarChar") || dbtype.StartsWith("VarChar"))
            {
                int index1 = dbtype.IndexOf("(");
                int index2 = dbtype.IndexOf(")");
                string dblen = dbtype.Substring(index1 + 1, index2 - index1 - 1);
                int.TryParse(dblen, out dblenint);
            }
        }
        return dblenint;
    }

LINQ到SQL获取类型和长度

不,你传递一个实体的实例。

我实际上会将其更改为将Type作为参数,而不是实例。

对于给定的实体,此方法将生成字符串字段长度的字典(LinqToSQL语法):

public static Dictionary<string, int> GetStrFieldsLen()
{
    Dictionary<string, int> dicFieldLen = new Dictionary<string, int>();
    var myEntity = new myEntity();
    foreach(var m in myEntity.GetType().GetProperties())
    {
        var typeName = myEntity.GetType().GetProperty(m.Name).PropertyType;
        int iLen = 0;
        if (typeName == typeof(string))
        {
            var tv= (m.CustomAttributes).First().NamedArguments.ToArray()[0].TypedValue.ToString(); // Get DbType member
             int idxStart = tv.LastIndexOf("(") + 1;
             if (int.TryParse(tv.Substring(idxStart, tv.LastIndexOf(")") - idxStart), out iLen)==false)
                iLen= int.MaxValue; // Field length is MAX
             dicFieldLen.Add(m.Name, iLen);
         }
    }
    return dicFieldLen ;
}