2017-10-28 109 views
1

我有以下lambda表達式的問題:C#Lambda表達式轉換奇怪,任何建議?

public IEnumerable<ModuleEntity> GetPageList(Pagination pagi, string query) 
{ 
    var expression = LinqExpression.Default<ModuleEntity>(); 
    expression = expression.And(e => 
     e.DeleteMark != 1 && 
     e.EnableMark != 0 
    ); 

    return this.BaseRepository().GetList(expression, pagi); 
} 

這是我的代碼,我想表達默認添加到我的生意。 注意:屬性EnableMarkDeleteMarknullable<int>。 當我調試,lambda表達式的表達式轉換到這一點:

{p => ((1 == 1) AndAlso ((p.DeleteMark != Convert(1)) AndAlso (p.EnableMark != Convert(0))))}; 

這導致了我的查詢拋出異常:

// use Dapper connection Query 
var query = dbConnection.Query<T>(linq); 

例外:無法識別的節點類型(轉換),

我想不通爲什麼lambda表達式給我Covnert(1)Convert(0),有什麼建議嗎?


我試圖將財產EnableMarkDeleteMark更改爲int,而不是nullable<int>,然後它的工作。但在其他情況下,nullable type是必要的,有沒有解決方案或文件? 謝謝。


@Eric利珀特感謝您指出的原因,我設置的值的變量「1」,讓它的類型來int?,並分配給DeleteMark。有效 !!

public IEnumerable<ModuleEntity> GetPageList(Pagination pagi, string query) 
{ 
    var expression = LinqExpression.Default<ModuleEntity>(); 
    int? deleteMark = 1; 
    int? enableMark = 0 
    expression = expression.And(e => 
     e.DeleteMark != deleteMark && 
     e.EnableMark != enableMark 
    ); 

    return this.BaseRepository().GetList(expression, pagi); 
} 
+1

是'var var param = query.ToJObject()'相關的問題?如果沒有,你可以刪除它們嗎? –

+0

請取消註釋或刪除任何不應被視爲的代碼。 – ChiefTwoPencils

回答

2

我想不通爲什麼lambda表達式給我轉換(1)和轉換(0)

當你注意,DeleteMark和EnableMark可爲空整數。 C#沒有定義int和可爲空的整數之間的比較運算符。它確實定義了兩個可爲空的整數之間的比較運算符,以及從int到可空int的轉換。 lambda轉換捕獲整數1和0已被轉換爲可空整數以進行比較的事實。

+0

感謝您的回答,但是如何改進它,在很多情況下可以使用空類型,在翻譯之前不能直接轉換它嗎? – Leo