【问题标题】:Linq Query with dynamic type动态类型的 Linq 查询
【发布时间】:2013-08-07 13:53:17
【问题描述】:

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

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

我遇到的问题是,从Sql Server获取数据集时,该字段需要解析为&lt;int?&gt;,而从Oracle获取时,需要解析为&lt;long?&gt;。有没有办法创建一个变量,我可以传递给 .Field 方法来动态设置这个数据类型?我想要这样的东西:

Type T = IsSqlServer ? typeof(int?) : typeof(long?);
....
row.Field<T>("id").HasValue == false &&

提前致谢!

【问题讨论】:

  • 你不能使用dynamic关键字吗?
  • @Killercam 成功了!如果你把它作为一个答案,我会尽可能地标记它。

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


【解决方案1】:

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

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

【讨论】:

  • 我一直在寻找比这更清洁的解决方案。在我正在处理的代码中,我可能有 100 次使用它,这将使它的可读性大大降低。
  • @mrK 你可以把它打包成一个方法。我可以给你看反射,但它会很丑。
  • 实际上,@Killercam 在 cmets 中有一个非常有效的建议。不过感谢您的帮助。
  • @mrK 嗯。老实说,我没想到动态。哦,好吧。
【解决方案2】:

您可以为此目的使用dynamic 关键字。编程指南见here

我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    这是一个扩展方法:

    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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 2016-10-16
      • 2011-06-13
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      相关资源
      最近更新 更多