2014-12-07 20 views
1

設置信息:MySQL的LINQ的使用。載有(可變)

  • VS2013/C#
  • EF6
  • MySQL數據庫
  • 的.Net連接器6.9.5

我試圖創建一個方法,使用部分名稱作爲搜索條件返回一組帳戶記錄。如果我使用IQueryable .Contains()擴展方法硬編碼字符串值,它會返回數據。但是,當我嘗試使用變量時,沒有返回數據。

Public class Test() { 

MyEntities db = new MyEntities(); 

//Works....but the search criteria is hard coded. 
    public IQueryable<Account> WorksButValueHardCoded() { 

    return (from a in db.Accounts 
      where a.accountname.Contains("Test") 
      select a); 
    } 

//Does not return anything 
    public IQueryable<Account> DoesNotReturnAnyData() { 

    //Obviously I would use a parameter, but even this test fails 
    string searchText = "Test"; 

    return (from a in db.Accounts 
      where a.accountname.Contains(searchText) 
      select a); 
    } 
} 

我可以看到在LINQ生成的SQL使用LIKE操作,但我不明白的變量是如何注入,因爲它記載:

SELECT 
`Extent1`.`accountid`, 
`Extent1`.`accountname` 
FROM `account` AS `Extent1` 
WHERE `Extent1`.`accountname` LIKE '%p__linq__0%' 

所以...爲什麼它的工作原理與硬編碼值,而不是一個字符串變量?

+0

請包括您提交給MySQL的錯誤。我遇到同樣的問題 – Ablue 2015-01-07 06:33:44

+1

這裏是:http://bugs.mysql。com/bug.php?id = 75137 – Ablue 2015-01-07 08:04:43

+0

看到相同的問題w/6.9.5,回滾到「Install-Package MySql.Data.Entities.EF6」,它是6.8.3,如@Ablue註釋中所述(也是:http ://bugs.mysql.com/bug.php?id=75193和http://bugs.mysql.com/bug.php?id=74918和http://bugs.mysql.com/bug.php?id= = 74943)唷! – sobelito 2015-01-19 21:35:02

回答

0

沒有什麼錯在理論上我可以看到

更新

這是我在SQLSERVER做工精細

public IQueryable<Account> DoesNotReturnAnyData(MyEntities db,string searchText) { 
    return (from a in db.Accounts 
     where a.accountname.Contains(searchText) 
     select a) 
} 
+0

是的,你是正確的,因爲上下文在返回之前處理(我已經改變爲使用上下文的類屬性)使用.ToList()函數確實會強制查詢。我試過了,但結果相同。硬編碼時工作,在使用字符串變量時不起作用。 – 2014-12-07 01:25:46

+0

我知道,對於MySQL的最新.Net連接器中的.Contains,.StartsWith和&.EndsWith擴展有一些變化,這與使用關鍵字'LIKE'有關。我幾乎想知道這是否是一個新的錯誤。有另一種方法可以做同樣的事情,我可以測試嗎? – 2014-12-07 01:35:29

+0

剛剛更新,上述工作正常在SQL服務器上,你可能是正確的,但我不使用MySQL,所以我不能測試,對你不幸 – 2014-12-07 01:40:03

4

我遇到了同樣的問題,其次錯誤步通過與Glimpse(一個很好的工具來檢查服務器在做什麼)的步驟。事實證明,SQL語句是正確構建的,因爲我通過在數據庫上執行它來獲得結果。 問題可能是在語句中替換字符串變量。我想LINQ不更換隻是你把這個字符串,但填充空格以達到VARCHAR極限的變量,以便您的查詢看起來像

SELECT`Extent1`.`accountid`, `Extent1`.`accountname` 
FROM `account` AS `Extent1` 
WHERE `Extent1`.`accountname` LIKE '%Test    ...  %' 

添加

.Trim() 

到您的字符串和它的作品。

public IQueryable<Account> DoesNotReturnAnyData() { 
    string searchText = "Test"; 

    // Use Trim() here 
    return (from a in db.Accounts 
     where a.accountname.Contains(searchText.Trim()) 
     select a); 
} 
+0

這爲我做了詭計! – 2015-06-30 21:03:18

0

這是報告的bug與MySQL實體框架6.9.5

錯誤#74918: https://bugs.mysql.com/bug.php?id=74918

它已被固定在MySQL連接/網:與實體框架6不正確的查詢結果6.7.7/6.8.5/6.9.6版本。

更改日誌: 使用實體框架6,將字符串引用傳遞給「StartWith」 子句會返回不正確的結果。

或者,解決方法是使用.Substring(0),這會強制實體不使用LIKE(可能會影響性能)。

return (from a in db.Accounts 
    where a.accountname.Contains(searchText.Substring(0))