从Linq Query获取DataTable

时间:2016-06-27 12:03:07

标签: c# asp.net entity-framework linq datatable

我想从Linq Query获取一个数据表,这就是我所做的..

public static DataTable GetAllDataNoWise(string UniqueNo)
{
    using (var objEntity = new DbContext())
    {
        var Query = from TBL in objEntity.GenerateCodes.AsEnumerable()
                    where TBL.UniqueNo == UniqueNo
                    select new
                    {
                        PrimaryID = TBL.GenerateCodeID,
                        TBL.Code,
                        ExpiryDate = TBL.ExpiryDate.ToShortDateString(),
                    };

        DataTable dt = LINQToDataTable(Query);
        return dt;
    }
}
public DataTable LINQToDataTable<T>(IEnumerable<T> varlist)
{
    DataTable dtReturn = new DataTable();

    PropertyInfo[] oProps = null;

    if (varlist == null) return dtReturn;

    foreach (T rec in varlist)
    {
        if (oProps == null)
        {
            oProps = ((Type)rec.GetType()).GetProperties();
            foreach (PropertyInfo pi in oProps)
            {
                Type colType = pi.PropertyType;

                if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
                == typeof(Nullable<>)))
                {
                    colType = colType.GetGenericArguments()[0];
                }

                dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
            }
        }

        DataRow dr = dtReturn.NewRow();

        foreach (PropertyInfo pi in oProps)
        {
            dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
            (rec, null);
        }

        dtReturn.Rows.Add(dr);
    }
    return dtReturn;
}

生成错误,如

  

非静态字段,方法或属性Code.LINQToDataTable<<anonymous type: int PrimaryID, string Code, string ExpiryDate>>(IEnumerable<<anonymous type: int PrimaryID, string Code, string ExpiryDate>>)

需要对象引用

1 个答案:

答案 0 :(得分:2)

由于第一个方法是静态的,除非它是静态的或从对象引用中实例化,否则它不能调用其他方法。

您可以将static添加到第二种方法

public static DataTable LINQToDataTable<T>(IEnumerable<T> varlist)

或者实例化包含第二种方法的类,并从第一种方法调用它:

var obj = new MyClass();
DataTable dt = obj.LINQToDataTable(Query);
相关问题