2016-06-17 56 views
0

我正在使用LINQ to Entities,並創建一個泛型類,可以根據用戶想要的字段在動態「Where」子句中進行標記在應用程序中搜索。動態LINQ到實體小數的格式「where」子句

這可以用在任何類型的實體在我的數據庫,所以我使用基於字符串的Where子句。

通過使用System.Linq.Dynamic,我已經有了一些基本的例子,例如,

字符串字段包含:

var data = db.Products; 
var query = String.Format("{0} > @0", filter.property); 
data = data.Where(query, filter.value); 

這些例子都工作得不錯:

var data = db.Products; 
var query = String.Format("{0}.Contains(@0)", filter.property); 
data = data.Where(query, filter.value); 

號碼字段大於。

我現在需要創建一個小數「等於」,但問題是數據庫中的貨幣值可能是10.3125,但它在應用UI中顯示爲10.31,所以如果用戶想要限制價格等於「10.31」,不會返回任何結果。我需要做的是通過查詢數據庫時限制的小數位的數量爲兩個,和比較,爲用戶的輸入十進制值,像這樣進行比較:

var data = db.Products; 
var query = String.Format("Decimal.Round({0}, 2).Equals(@0)", filter.property); 
data = data.Where(query, filter.value); 

其中「filter.property」是列/字段名稱,「filter.value」包含十進制值。

但是,這將引發一個運行時錯誤:

An exception of type 'System.ArgumentException' occurred in System.Core.dll but was not handled in user code

Additional information: Argument types do not match

我似乎無法找到Where子句涉及十進制數字,或數字的格式基於字符串的LINQ的許多體面的例子。

有沒有關於如何使這項工作的建議?作爲最後的手段,我可​​以從表中取回所有數據,在存儲器中適當地格式化十進制數,然後將Where子句添加到內存中的結果集中,但是這會對資源造成很大影響。當然,有一種方法可以通過LINQ to Entities動態地執行此操作?

在此先感謝。

回答

0

它更容易使用範圍檢查,其中該範圍是過濾值+/- 0.005:

10.305 < value <= 10.315 

這也是更好地做這種方式,因爲如果你一輪數據庫值第一,查詢優化器不能再使用索引。搜索不是sargable

+0

太棒了,謝謝! –