2013-02-26 28 views
4

我遇到了用於自定義篩選來自DataGridView的數據的lambda表達式的問題。lambda表達意義/修改

這是表達:

private static Expression<Func<T, bool>> ExpressionLongEquals<T>(string Key, long Value) 
{ 
    var param = Expression.Parameter(typeof(T)); 
    // create expression for param => param.TEntityNameId == PrimaryKey 
    var lambda = Expression.Lambda<Func<T, bool>>(
     Expression.Equal(
      Expression.Property(param, Key), 
      Expression.Constant(Value)), 
     param); 
    return lambda; 
} 

的問題是,我有一個情況下,當Value參數是long?類型的,因爲它似乎是可以接受的,但在完成這個代碼後,我得到的錯誤Method equal is not defined for Nullable1.System.Int64 and System.Int64的。我在理解這種方法時遇到困難,不太確定這是否可以理解,但是我會發布我的問題 - 首先,究竟是什麼,我的意思是 - 我需要學習/閱讀的內容爲了能夠像這樣的代碼類似我發佈和第二。我很確定這種方法適用於long的值,只有當long?作爲參數傳遞時纔會出現問題,所以有什麼方法可以修改它來解決這個問題嗎?

long?值的需求是最近的,這就是導致問題一般我這樣做:

else if (property.PropertyType == typeof(long?)) 
{ 
    long value = Convert.ToInt64(rule.Data); 
    selector = ExpressionLongEquals<T>(rule.Field, value); 
} 

,但我仍然得到錯誤有關equal not defined for Nullable1.System.Int64 and System.Int64

+2

當函數簽名要求它只是「很長」時,'value'如何可以'長'? – Jon 2013-02-26 14:22:31

+2

@Jon:房產是'長?'。 – SLaks 2013-02-26 14:25:48

+0

請參閱編輯的代碼。正如我所說,我不完全明白,所以我不確定哪些部分對解決問題很重要。也許現在就足以指導我去解決一些我必須學習/閱讀的具體問題,以便更好地處理這個問題。 – Leron 2013-02-26 14:28:38

回答

2

使用此...如果我是正確的,您必須將您的值轉換爲長類型?

private static Expression<Func<T, bool>> ExpressionLongEquals<T>(string Key, long Value) 
{ 
    var param = Expression.Parameter(typeof(T)); 
    // create expression for param => param.TEntityNameId == PrimaryKey 
    var lambda = Expression.Lambda<Func<T, bool>>(
     Expression.Equal(
      Expression.Property(param, Key), 
      Expression.Constant(Value, typeof(long?)), 
     param); 
    return lambda; 
} 
+0

感謝'Gopesh夏爾馬'這工作正如我想。你能告訴我一些更具體的查找方式,以便習慣使用這種類型的代碼嗎? – Leron 2013-02-26 14:38:14

+0

@Leron無論何時你處理一些可爲空的值,你必須將它轉換爲可空類型,主要是當你指定或比較(如:等於) – 2013-02-26 14:47:29

+0

是的,這是解決當前問題的原因,我的意思是我需要閱讀/學習,以便更好地使用'Expression','Func','Equal'和所有這些東西。我知道這與lambda有很強的聯繫,但是,你能告訴我更多具體的'lambda'部分,它指的是那種類型的情況,所以我可以一點一點地學習我需要和使用的東西嗎?謝謝。 – Leron 2013-02-26 14:58:08