2017-02-09 48 views
1

需要說明的是,我並不是指對EF調用的結果執行.Cast<T>有沒有辦法在實體框架查詢的Where部分中投射?

我試圖在數字字段上實現部分搜索。

當創建一個SQL腳本,很容易一列轉換爲另一種數據類型:

SELECT Id 
FROM Employees 
WHERE CAST(Id AS VARCHAR) LIKE '%95%'; 

是否有LINQ查詢任何形式的相同呢?

我無法修改我查詢的實體上的數據類型,而Id僅用於演示目的。

+0

也許[這](http://stackoverflow.com/questions/158634/doing-a-cast-within-a-linq-query)的問題可以幫助你 – LeeonTM

+1

你可能會考慮'SqlFunctions'類。它有許多LINQ提供者直接支持的方法。我不知道它是否有'Cast'或'Convert'方法。 IIRC,它具有'StringConvert' – Amy

+1

該SQL查詢實際上是一個錯誤。如果你必須把一個沒有商業意義的Id轉換成一個*字符串*,那麼你可以執行一個文本搜索,這是非常錯誤的。至少,您必須掃描整個表格,因爲強制轉換和通配符搜索會阻止使用索引 –

回答

4

我不知道爲什麼ToString不起作用,但這對我來說很有用。無需SqlFunctions:

  context.Employees.Where(emp => emp.Id.ToString().Contains("95")).ToList(); 
+0

是的,你說得對。我的錯。 – krillgar

3

您可以使用SqlFunctions.StringConvert

var q = db.Employees 
    .Where(emp => SqlFunctions.StringConvert((decimal) emp.Id).Contains("95")); 
1

如果你不能找到一個SqlFunctions解決方案,總有ExecuteQuery

var ids = db.ExecuteQuery<int>("SELECT Id FROM Employees WHERE CAST(Id AS VARCHAR) LIKE '%{0}%'", "95") 

(這可能不是參數完全正確的。)
+0

在大多數情況下,我會同意並接受此條款。但是,在我的特定情況下,還有一堆其他過濾和其他事情正在進行,這會使查詢過於棘手。對於在這個問題中我沒有表示道歉,但是我想讓他們專注於確切的問題。這絕對會幫助別人!謝謝。 :D – krillgar