2010-10-18 14 views
1

我需要與特殊字符或數字中的LINQ to SQL查詢我的asp.net MVC(C#)應用程序啓動名稱列表。得到名稱與數字或特殊字符開始在LINQ to SQL中

我已經試過這樣的(這可能不是有效的):

public List<User> GetUsersStartingWithNonCharacter() 
{ 
    List<User> _dbUsers = this.GetAllUsers(); 
    return _dbUsers.Where(p => ((p.FirstName != null && p.FirstName != string.Empty && !char.IsLetter(p.FirstName.ToLower()[0])) || (p.FirstName == null || p.FirstName == string.Empty))).ToList(); 
} 

public List<Users> GetAllUsers() 
{ 
    return (from u in _context.pu_Users 
      where !u.Is_Deleted 
      select new User 
      { 
       UserId = u.User_Id, 
       Email = u.Email_Address, 
       FirstName = u.First_Name, 
       LastName = u.Last_Name 
      }).ToList(); 
} 

任何人都可以提出最有效的方式做到這一點的LINQ to SQL?

+0

你應該跟蹤/分析你的數據庫,看看在sql方面查詢的樣子。然後你可以決定它是否有效。 – 2010-10-18 07:06:33

+0

除了數字之外,是什麼讓這個角色「特別」。一個很大的效率問題是正確匹配字符,但最有效的方法將取決於「特殊」的含義。 – 2010-10-18 09:03:09

回答

1

你怎麼知道它是不是已經有效?使用一些分析器工具,如SQL Server Profiler(如果您使用的是MSSQL),那樣您可以跟蹤數據庫的調用並查看實際的SQL。當然,您只能調試代碼以查看生成的SQL,但使用分析器工具更容易,您將看到查詢需要多長時間。

編輯:我看到你如何使它更有效的一個部分:

public List<User> GetUsersStartingWithNonCharacter() 
{ 
    List<User> _dbUsers = this.GetAllUsers(); 
    return _dbUsers.Where(p => ((p.FirstName != null && p.FirstName != string.Empty && !char.IsLetter(p.FirstName.ToLower()[0])) || (p.FirstName == null || p.FirstName == string.Empty))).ToList(); 
} 

public IQueryable<Users> GetAllUsers() 
{ 
    return from u in _context.pu_Users 
      where !u.Is_Deleted 
      select new User 
      { 
       UserId = u.User_Id, 
       Email = u.Email_Address, 
       FirstName = u.First_Name, 
       LastName = u.Last_Name 
      }; 
} 

改變你GetAllUsers返回的IQueryable將延遲查詢執行,直到你應用你的過濾器。這可能會影響設計的其他方面,但您應該考慮它,因爲該更改可能會使where子句在數據庫中運行,而不是在代碼中運行,這會導致應用程序和數據庫之間的數據通信量減少。再次使用探查器查看區別:)。

+0

用於編輯。除了他的「檢查第一個字符」的條件仍然會拉動所有行。 – 2010-10-18 07:42:07

+0

我想它會,但它是一個開始:)。正如我們都說過的,他需要使用分析器,然後從那裏繼續。 – 2010-10-18 07:46:18

0

,我會在這之情況

這裏使用Regular Expression是我的示例代碼

return _dbUsers.Where(p=>p.FirstName!=String.Empty) 
       . Where(p => Regex.Match(p.Firstname[0].ToString(), "[a-zA-Z]").Success).ToList(); 
0

我懷疑所有行會因條件進行檢索和應用程序中的filted:

char.IsLetter(p.FirstName.ToLower()[0]) 

(使用正則表達式就像在另一個答案也將拉動中的所有行,並篩選它們的客戶端上的建議。)

有可能與PATINDEX函數的字符串來檢查字符,但它似乎只能通過實體框架,可用於LINQ。

你可以使用PATINDEX直接檢查的第一個字符來優化你的查詢編寫一個存儲過程。樣本查詢可在http://www.databasejournal.com/features/mssql/article.php/3071531/Using-SQL-Servers-CHARINDEX-and-PATINDEX.htm找到。

有時LINQ to whatever不會產生最優化的解決方案,但是這只是生活。在大多數情況下,它會提供更清晰的代碼,但特殊情況下可能需要解決方法才能使用底層系統的特殊操作員。