2010-10-18 90 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不会产生最优化的解决方案,但是这只是生活。在大多数情况下,它会提供更清晰的代码,但特殊情况下可能需要解决方法才能使用底层系统的特殊操作员。