簡體   English   中英

將 linq 中的字符串轉換為 int 到大數據庫上的實體

[英]Converting string to int in linq to entities on big database

我想將 linq 中的字符串轉換為 int 到實體,但 Convert.ToInt32 和 int.Parse 無法轉換為 sql 而且我的數據庫很大,無法將它們全部放入內存(超過 60k 記錄並變得更大)我的查詢類似於

int myNumber = 1390;
var result = from dr in myEntitiy.TableX
             where (Convert.ToInt32(dr.stringYear) > myNumber) // <== error
             select dr; 

錯誤說無法翻譯轉換方法

LINQ to Entities 無法識別方法 'Int32 ToInt32(System.String)' 方法,並且此方法無法轉換為存儲表達式。

什么解決方案

更新:如果沒有辦法做到這一點,請讓我確定這一點,然后我必須更改數據庫中的字段類型,但這會很難:(

我認為將比較作為字符串進行比較是很安全的,除非您的年數 < 1000 或 > 9999:

... dr.stringYear.CompareTo(myNumberString) > 0

EF 將其轉換為 SQL 謂詞,如

WHERE [alias].[stringYear] > @p

這在 SQL 中是可能的,但在 C# 中是不可能的。

一個優點是stringYear上的任何索引都可以在執行計划中使用。 stringYear轉換為 number 會消除任何索引。

當字符串列包含鋸齒狀字符串值時,此方法仍然有用。 在這種情況下,謂詞應與 Length 結合使用。 例如,要查找作為整數的任何數字字符串大於某個參考值的所有實體

var len = myNumberString.Lenght;

var query = 
    from row in context.LegacyTable
    where row.NumericString.CompareTo(myNumberString) > 0
       && row.NumericString.Length >= len
    select row; 

然后查詢引擎不能使用索引進行長度比較,但它可能能夠為>比較這樣做。

這有效,但生成的 SQL 會很亂

int myNumber = 1390;
var result = from dr in myEntitiy.TableX
             let num = myEntitiy.TableX.Take(1).Select(x => dr.stringYear).Cast<int>().FirstOrDefault()
             where num > myNumber
             select dr; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM