2016-08-09 52 views
0

我收到以下錯誤,但我不知道如何重寫我的聲明? 任何想法?實體框架 - 字符串轉換錯誤

錯誤:

LINQ to Entities does not recognize the method 'System.String Convert(System.String)' method, and this method cannot be translated into a store expression

代碼:

public Client FindClientByMobile(string mobile, string accountId) 
{ 
    Client client = RepositorySet.Include("Account").FirstOrDefault(c => c.AccountId == accountId && !c.IsDeleted 
      && ((Convert(c.TelephoneHome) == mobile) || (Convert(c.TelephoneMobile) == mobile) || (Convert(c.TelephoneWork) == mobile))); 
    return client; 
} 

public static string Convert(string mobile) 
{ 
    var filterNumber = from letter in mobile 
         where char.IsDigit(letter) 
         select letter; 

    StringBuilder number = new StringBuilder(); 
    number.Append(filterNumber.ToArray()); 

    return number.ToString(); 
} 
+2

該錯誤表示Linq需要將您的表達式轉換爲Sql語句。您的自定義'Convert'方法不可翻譯,因爲它是c#代碼,而不是數據庫服務器上也存在的。 – Igor

+0

嗨,謝謝,但我已經說過這個問題,我問,但我不知道如何重寫我的聲明? –

+0

電話號碼是字符串 –

回答

4

的錯誤意味着LINQ的需要表達式轉換成SQL語句。您的自定義Convert方法不可翻譯,因爲它是c#代碼,而不是數據庫服務器上也存在的。

由於您已經在傳遞您的帳戶ID,我將假設這是唯一的或者將其過濾到足夠接近唯一的位置以確保您不檢索大量對象。然後,您可以首先實現對象圖,然後在c#中過濾更多(linq到對象)。這是通過使用ToList()調用完成的。

public Client FindClientByMobile(string mobile, string accountId) 
{ 
    var clients = RepositorySet.Include("Account").Where(c => c.AccountId == accountId && !c.IsDeleted).ToList(); 
    return clients.FirstOrDefault(client => Convert(client.TelephoneHome) == mobile || Convert(client.TelephoneMobile) == mobile || Convert(client.TelephoneWork) == mobile); 
} 
+0

這很聰明。好地方! –

1

這是否適合你,因爲你在使用Replace你也可以替換像()還有其他字符您的評論

@Imad, what im trying to do is validate, so if the number has been stored in the database as 0331-9000-100, I want to remove all non numeric characters, mobile has already had this applied, so mobile = 033319000100

public Client FindClientByMobile(string mobile, string accountId) 
{ 
    Client client = RepositorySet.Include("Account").FirstOrDefault(c => c.AccountId == accountId && !c.IsDeleted 
      && ((c.TelephoneHome.Replace("-","") == mobile) || (Convert(c.TelephoneMobile) == mobile) || (Convert(c.TelephoneWork) == mobile))); 
    return client; 
} 

提及。

要點記住:Replace(char, char)將無法​​正常工作,但Replace(string, string)會。

0

第一個問題是Convert調用是C#,無法轉換爲SQL。並非所有函數都可以,但是一些(例如子字符串)對Entity Framework「已知」,並且可以將它們轉換爲適當的SQL。所以你需要重寫你的語句來使用EF知道的字符串函數,或者用其他方式將邏輯推入數據庫。

@Imad已經建議使用string.Replace,這已知EF,當然它不會幫你移除一切可能的非數字字符 - 只有那些你明確地編碼,如「 - 」,但不包括其他字母字符串,比如'extension'。

如果您希望快速完成此操作,最好將「已清理」的號碼存儲在不同的字段中。然後查詢變成

Client client = RepositorySet.Include("Account").FirstOrDefault(c => c.AccountId == accountId && !c.IsDeleted 
     && (c.TelephoneHomeClean == mobile) || (c.TelephoneMobileClean == mobile) || (c.TelephoneWorkClean == mobile))); 
return client; 

而且你有一些東西可以做得更快和索引。

+0

長期的好主意,因爲我需要編寫一些SP來審計/更新數據。 –

+0

是的,這肯定比你想要的更煩人。 –