在SQL表中查找联系人列表中的匹配联系人

时间:2018-02-19 21:38:43

标签: c# sql sql-server database sqlclient

我正在为聊天应用编写服务器应用程序,该应用程序从用户地址簿接收电话联系人列表List<string>,其中字符串是标准化的电话号码。我现在想将它与我保存所有注册用户的SQL数据库进行比较。

现在我遍历列表中的每个项目并查询 SELECT * FROM Users WHERE Number = @0并在每个查询中打开与SqlConnection(connectionString)的新连接。我之所以这样做,是因为我知道.NET会处理/汇集打开的连接。

var phoneNumbers = new List<string> { "0049123456789", "001123456789" };
var registeredUsers = new List<string>();
foreach (var phoneNumber in phoneNumbers)
{
    try
    {
        var userName = GetFrom(phoneNumber);
        registeredUsers.Add(userName);
    }catch{}
}

//...

public static string GetFrom(string telephoneNumber)
{
    string retVal = null;
    using (var connection = new SqlConnection(connectionString))
    {
        using (var cmd = SetSQLCommand(connection, "SELECT * FROM Users WHERE Number = @0", telephoneNumber))
        {
            connection.Open();
            using (var reader = cmd.ExecuteReader())
            {
                if (reader.HasRows)
                {
                    while (reader.Read())//Get last
                    {
                        retVal = (string)reader["Name"];
                    }
                }
                else
                {
                    throw (new KeyNotFoundException());
                }
            }
        }
    }
    return retVal;
}

这种方法感觉非常愚蠢,因为用户联系人列表可能包含1000个或更多联系人。

是否有一种更优雅的方法可以从我在SQL表格中作为C#对象的电话号码列表中查找所有匹配的电话号码?

由于性能对我来说非常重要,我使用SQL System.Data.SqlClient的.NET 4.5实现,Entity Framework对我来说太慢了。

1 个答案:

答案 0 :(得分:1)

当我遇到类似这样的情况时,这是我的看法:

  • 我会将所有电话号码连接成一个格式化的字符串
  • 我将使用“IN” T-SQL
  • 在动态SQL查询中传递该字符串

可能就是这么简单:

    public List<string> ReturnContactNames(string telephoneNumbers)
    {
        var retVal = new List<string>();
        using (var connection = new SqlConnection(connectionString))
        {
            using (var cmd = new SqlCommand("SELECT * FROM Customers WHERE Phone IN (" + telephoneNumbers + ")", connection))
            {
                connection.Open();
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        retVal.Add((string)reader["ContactName"]);
                    }
                }
            }
        }
        return retVal;
    }

然后你可以使用这种方法:

        var phoneNumbers = "'030-0074321','0621-08460'";
        var list = ReturnContactNames(phoneNumbers);

警告:尽可能使用参数化查询。这只是一个快速的样本,只是为了给你一个想法。

希望它有所帮助。