C# 如何创建(谓词)以使用Express.call方法从DataTable获取数据

C# 如何创建(谓词)以使用Express.call方法从DataTable获取数据,c#,asp.net,linq,C#,Asp.net,Linq,我在Home Controller中有一个数据表,如下所示: public DataTable GetTable() { DataTable table = new DataTable(); table.Columns.Add("Dosage", typeof(int)); table.Columns.Add("Drug", typeof(string)); table.Columns.Add("Patient", typeof(Info)); table

我在Home Controller中有一个数据表,如下所示:

public DataTable GetTable()
{
    DataTable table = new DataTable();
    table.Columns.Add("Dosage", typeof(int));
    table.Columns.Add("Drug", typeof(string));
    table.Columns.Add("Patient", typeof(Info));
    table.Columns.Add("Date", typeof(DateTime));

    table.Rows.Add(25, "Indocin", new Info("India"), DateTime.Now);
    table.Rows.Add(50, "Enebrel", new Info("UK"), DateTime.Now);
    table.Rows.Add(10, "Hydralazine", new Info("Bhutan"), DateTime.Now);
    table.Rows.Add(21, "Combivent", new Info("India"), DateTime.Now);
    table.Rows.Add(100, "Dilantin", new Info("GreenLand"), DateTime.Now);
    return table;
}
信息类如下

public class Info
{
    public string Address { get; set; }
    public Info(string Add) {
        this.Address = Add;
    }
}
现在,我想根据地址字段进行过滤操作,即Patient.Address

这里,病人是信息类的对象

我需要形成条件,以便获取数据

我正在使用Express.call方法形成条件

private static MethodCallExpression GetFieldCallExpression(Expression memExp, Type ColumnType, string ColumnName)
        {
            MethodInfo method = typeof(DataRowExtensions).GetMethods().Where(m => m.Name == "Field" && m.IsGenericMethod && m.GetParameters().Count() == 2 && m.GetParameters()[1].ParameterType == typeof(string)).FirstOrDefault();
            var genericWrapper = method.MakeGenericMethod(new Type[] { ColumnType });
            var toLowerMethodCall = Expression.Call(
                 null,
                 genericWrapper,
                 memExp,
                 Expression.Constant(ColumnName, ColumnName.GetType())
                 );
            return toLowerMethodCall;
        }
这里是memExp-DataRow的实例 columnName-患者地址 列类型-字符串

它得到的信息是

“列‘Patient.Address’不属于表。”


我在哪里犯了错误

DataRow
值访问器仅支持“顶级”列名称(如样本中的“剂量”、“药物”、“患者”等)。为了实现您的目标,您必须分割路径并手动生成访问器

例如,“Patient.Address”的样本访问器应该是
dr.Field(“Patient”).Address
或者换句话说:

var value1 = dr.Field<Info>("Patient");
var value2 = value1.Address;
...
return value2;
var value1=dr.Field(“患者”);
var value2=value1.地址;
...
返回值2;
以下是一般实施的相同方法:

private static Expression GetFieldValueExpression(Expression source, Type columnType, string memberPath)
{
    var memberNames = memberPath.Split('.');
    Expression value = Expression.Call(
        typeof(DataRowExtensions), "Field", new Type[] { columnType },
        source, Expression.Constant(memberNames[0]));
    for (int i = 1; i < memberNames.Length; i++)
        value = Expression.PropertyOrField(value, memberNames[i]);
    return value;
}
私有静态表达式GetFieldValueExpression(表达式源、类型columnType、字符串成员路径)
{
var memberNames=memberPath.Split('.');
Expression value=Expression.Call(
typeof(DataRowExtensions),“字段”,新类型[]{columnType},
source,Expression.Constant(memberNames[0]);
for(int i=1;i
DataRow
值访问器仅支持“顶级”列名(如样本中的“剂量”、“药物”、“患者”等)。为了实现您的目标,您必须分割路径并手动生成访问器

例如,“Patient.Address”的样本访问器应该是
dr.Field(“Patient”).Address
或者换句话说:

var value1 = dr.Field<Info>("Patient");
var value2 = value1.Address;
...
return value2;
var value1=dr.Field(“患者”);
var value2=value1.地址;
...
返回值2;
以下是一般实施的相同方法:

private static Expression GetFieldValueExpression(Expression source, Type columnType, string memberPath)
{
    var memberNames = memberPath.Split('.');
    Expression value = Expression.Call(
        typeof(DataRowExtensions), "Field", new Type[] { columnType },
        source, Expression.Constant(memberNames[0]));
    for (int i = 1; i < memberNames.Length; i++)
        value = Expression.PropertyOrField(value, memberNames[i]);
    return value;
}
私有静态表达式GetFieldValueExpression(表达式源、类型columnType、字符串成员路径)
{
var memberNames=memberPath.Split('.');
Expression value=Expression.Call(
typeof(DataRowExtensions),“字段”,新类型[]{columnType},
source,Expression.Constant(memberNames[0]);
for(int i=1;i
Hi Ivan,我已经尝试了你的建议,我得到了错误,“System.ArgumentException:'Address'不是'System.String'类型的成员”,位于value=Expression.PropertyOrField(value,ColumnNames[I]);嗨,Kalai,我想你已经通过了
typeof(string)
作为
columnType
,而程序希望它是
typeof(Info)
(基本上与创建专栏时使用的相同)嗨,Ivan,是的,我错误地将患者的columnType作为string发送,但它应该是Info类。嗨,Ivan,我已经尝试了你的建议,我在value=Expression.PropertyOrField(value,ColumnNames[i])处遇到错误,“System.ArgumentException:'Address'不是'System.String'类型的成员”;嗨,Kalai,我想你已经通过了
typeof(string)
作为
columnType
,而程序希望它是
typeof(Info)
(基本上与创建专栏时使用的相同)嗨,Ivan,是的,我错误地将患者的columnType作为string发送,但它应该是Info类。