Linq查询动态类型

时间:2013-08-06 13:53:55

标签: c# linq c#-4.0 dataset typing

我使用以下linq来解析我返回的数据集:

 row.Field<long?>("id").HasValue == false &&

我遇到的问题是,当从Sql Server获取数据集时,该字段需要使用<int?>进行解析,当从Oracle获取时,需要将其解析为{{1} }。有没有办法创建一个变量,我可以传入.Field方法来动态设置这种数据类型?我想要这样的东西:

<long?>

提前致谢!

3 个答案:

答案 0 :(得分:3)

您可以使用反射(不推荐)或只使用三元运算符:

!(IsSqlServer ? row.Field<int?>("id").HasValue : row.Field<long?>("id").HasValue)

答案 1 :(得分:1)

这是一个扩展方法:

public static class DataRowHelpers
{
    private static readonly Dictionary<Type, MethodInfo> FieldSpecialized = new Dictionary<Type, MethodInfo>();

    public static bool FieldHasValue(this DataRow row, Type type, string column)
    {
        MethodInfo fieldSpecialized;

        if(!FieldSpecialized.TryGetValue(type, out fieldSpecialized))
        {       
            var extensions = typeof(DataRowExtensions);
            var fieldGeneric = extensions.GetMethod("Field",
                                                    new[] { typeof(DataRow), typeof(string) });
            fieldSpecialized = fieldGeneric.MakeGenericMethod(type);

            FieldSpecialized.Add(type, fieldSpecialized);
        }


        return fieldSpecialized.Invoke(null, new object[] { row, column }) != null;
    }
}

用法:

var type = IsSqlServer ? typeof(int?) : typeof(long?);

var predicate = row.FieldHasValue(type, "id");

答案 2 :(得分:1)

您可以将dynamic关键字用于此目的。有关编程指南,请参阅here

我希望这会有所帮助。