2

登録可能な ASP Web サイトを作成しています。

訪問者が登録するニックネームは一意である必要があります。

ユーザーが登録するたびに、データベースからすべてのユーザーを選択し、 foreach ループを使用してチェックするか、ユーザー名が既に存在するかを確認します。

private List<User> listExistingUsers;
listExistingUsers = Database.GetUsers();
foreach (User u in listExistingUsers)
{
    if (u.Nickname == txtNickname.text)
    {
        Error = "Username already in use.";
    }
}

しかし、上記のコードは正しく動作しません。データベースから読み取られたリスト内のすべての項目をチェックするわけではありません。したがって、同じユーザー名を持つユーザーがいる可能性がありますが、これは望ましくありません。

この問題を解決するにはどうすればよいですか? LINQ について読みましたが、これは List<> でユーザー名をチェックする間違った方法だと思います。このユーザー名チェックは別の方法で行う必要があると思います。

専門家は私を助けてくれますか?このチェックは SQL クエリでも実行できますが、C# で実行したいと考えています。

4

8 に答える 8

6

DB からすべてのユーザーを返す代わりに、ユーザー名をクエリ/ストアド プロシージャに渡し、バックエンドにチェックを行わせてから、ステータス フラグ 1/0 (存在する/しない) だけを返します。

于 2013-07-17T17:43:14.407 に答える
4

if (Database.GetUsers().Select(x => x.Nickname).Contains(txtNickname.Text))あなたがしたいことをするべきです。

すべてを 1 行にまとめたので、簡単に説明します。最初にあなたのDatabase.GetUsers()メソッドを使用してユーザーを取得し、次に select を使用してニックネームを投影します。それが比較対象だからです。それが単独で実行されるIEnumerable<string>と、すべてのニックネームが含まれます。そこから、contains を使用して、UI に入力された (私が想定している) ニックネームがそのリストに含まれているかどうかを確認します。

于 2013-07-17T17:41:55.033 に答える
1

Contains operator確認するために使用できます

listExistingUsers.Select(x => x.Nickname).Contains(txtNickname.text);

リンク: http://msdn.microsoft.com/fr-fr/library/bhkz42b3%28v=vs.80%29.aspx

備考 :Anyまたはcount(非常に高価な最後のソリューション)を使用できます。

于 2013-07-17T17:41:09.843 に答える
1

Any演算子を使用します。シーケンスの要素が何らかの条件を満たすかどうかをチェックします。あなたの場合、条件はユーザーのニックネームが textBox のテキストと等しいです:

if (Database.GetUsers().Any(u => u.Nickname == txtNickname.Text))
    Error = "Username already in use.";

ところで、GetUsers戻るように変更するIQueryable<User>と、サーバー側でチェックが行われます。

于 2013-07-17T17:42:58.617 に答える
1

ニックネームのリストを一度取得する

var nickNames = new List<string>();

for(int i=0;i<listExistingUsers.Count;i++)
{
     nickNames.Add(listExistingUsers.NickName);
}

次に、単に使用できます

if(nickNames.Contains(txtNickname.text))
{
     Error = "Username already in use.";
}
于 2013-07-17T17:43:09.373 に答える
0

1) Database.GetUsers() が実際に完全なリストを返し、SQL の問題がないことを確認しましたか?

2) 大文字と小文字を区別しない必要がありますか?

3) LINQ を使用して、次のようなクエリを実行できます。

if (listExistingUsers.Any(u => string.Equals(u, txtNickname.Text, StringComparison.CurrentCultureIgnoreCase)))
{
   // Process error
}
于 2013-07-17T17:44:35.530 に答える
0

あなたの仕事の最も難しい部分は、データベースを正しく埋めることだと思います。

特に:

  • 末尾と末尾のスペースを切り取る
  • ユーザー名の大文字と小文字を区別するかどうかを決定する
  • 新しいユーザー名を作成するときは、まだニックネームを持っていないことを確認してください

ユーザーのロードとチェックについて:

上記のように、LINQ は C# のように重複をチェックするのに最も効果的です ( if (Database.GetUsers().Select(x => x.Nickname).Contains(txtNickname.Text)))

私は、LINQ を使用するよりも SQL ステートメントを作成することに慣れています。多くのユーザーがいる場合、SQL は選択されたユーザーのみを読み取りますが、上記の LINQ ステートメントがすべてのユーザーをメモリ プールにプルするのか、それとも同じニックネームを持つユーザーだけをプルするのかはわかりません。

于 2013-07-17T18:09:46.797 に答える
0

Database.GetUsers() がデータベースからすべてのユーザーを返す場合は、使用しないでください。すでに 1000 人のユーザーがいる場合、新しいユーザーごとにすべてのユーザーが読み込まれ、パフォーマンスの問題が発生することを想像してください。

代わりに、データベースを検索し、存在する場合に1 つの結果のみを返す新しいメソッドを作成します。何かのようなもの :

private bool Database.UserExists(txtNickname.text) {
      //Your query to database with a where statment looking for the nickname. It could be a LINQ query, or any other way you use in your system.
      //If it brings 1 result, it has to return true. 
 }
于 2013-07-17T18:00:32.050 に答える