2013-08-06 53 views
1

我使用以下LINQ解析說我回來了一個數據集:LINQ查詢與動態類型

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

我遇到的問題是,當這些數據是從SQL Server,該領域獲得的需要使用<int?>進行解析,並且從Oracle獲取時,需要將其解析爲<long?>。有沒有辦法創建一個變量,我可以傳遞給.Field方法來動態設置這種數據類型?我想有這樣的事情:

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

在此先感謝!

+0

你不能使用'dynamic'關鍵字嗎? – MoonKnight

+0

@Killercam工作!如果你把它作爲答案,我會盡可能標記它。 – mrK

+0

很酷。我會的。謝謝。 – MoonKnight

回答

1

你可以爲此僅使用dynamic關鍵字。有關編程指南,請參閱here

我希望這會有所幫助。

3

你既可以使用反射(不推薦),或只是使用三元運算:

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

我正在尋找比這更清潔的解決方案。在我正在編寫的代碼中,我可能有100個這樣的用法,並且它會使其不易讀。 – mrK

+0

@mrK然後你可以把它裝進一個方法。我可以向你展示反射,但它會很醜陋。 –

+0

其實,@ Killercam在評論中有一個很好的建議。儘管感謝您的幫助。 – mrK

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