Поиск в базе данных по имени и фамилии - PullRequest
0 голосов
/ 29 июня 2009

Я использую ASP.NET с C # и дозвуковой. Я пытаюсь настроить поиск по текстовому полю по имени и фамилии.

    First or Last Name: <asp:TextBox ID="txtSearchName" runat="server"></asp:TextBox> 
<asp:linkButton runat="server" Text="Send" onclick="btnSubmit_Click" />
    <asp:GridView 
    border="0"
    cellpadding="3"
    cellspacing="3"
    ShowHeader="True"
    allowsorting="true"
    ID="GridView1" 
    runat="server" 
    AutoGenerateColumns="false" 
    Visible="false"
    AllowPaging="True" 
    PageSize="10" 
    PagerStyle-Mode="NumericPages"
    OnPageIndexChanging="GridView1_PageIndexChanging"
    >

В коде у меня есть это:

private void BuildGridView1()
    {
        GridView1.DataSource = new Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*")
              .From(PastAwardName.Schema)
              .InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID)
              .Where(PastAwardName.Columns.LName).IsEqualTo(this.txtSearchName.Text)
              .Or(PastAwardName.Columns.FName).IsEqualTo(this.txtSearchName.Text)
              .OrderAsc(PastAwardType.Columns.AwardYear)
              .ExecuteDataSet();

    }

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    BuildGridView1();
    GridView1.PageIndex = e.NewPageIndex;
    GridView1.DataBind();
}

Это работает, если вы вводите имя или фамилию, но я хочу иметь возможность искать их одновременно в одном текстовом поле. Это возможно?

Ответы [ 2 ]

2 голосов
/ 29 июня 2009

Вы должны иметь возможность построить свой запрос и затем добавить ограничения «И / И» в зависимости от того, есть ли у вас более одного имени. Следующее должно работать, но вы должны знать, что крайние случаи, такие как имена с двойным обнажением, пользователь, вводящий второе имя и т.д., поймают вас:

private void BuildGridView1()
{
  string[] names = this.txtSearchName.Text.Split(" ".ToCharArray());

  SqlQuery query = DB.Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*")
    .From(PastAwardName.Schema)
    .InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID)
    .Where(PastAwardName.Columns.FName).IsEqualTo(names[0])

  if(names.Length > 1)
    query = query.And(PastAwardName.Columns.LName).IsEqualTo(names[1])
  else
    query = query.Or(PastAwardName.Columns.LName).IsEqualTo(names[0]

  GridView1.DataSource = query.OrderAsc(PastAwardType.Columns.AwardYear)
    .ExecuteDataSet();
}
1 голос
/ 29 июня 2009

Разделите содержимое this.txtSearchName.Text, если оно содержит одно слово, используйте исходный запрос, если оно содержит два слова, а затем используйте измененную версию запроса:

private void BuildGridView1()
    {
        string[] names = String.Split(this.txtSearchName.Text, ' ');
        if (names.length == 1) {
            GridView1.DataSource = new Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*")
              .From(PastAwardName.Schema)
              .InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID)
              .Where(PastAwardName.Columns.LName).IsEqualTo(names[0])
              .Or(PastAwardName.Columns.FName).IsEqualTo(names[0])
              .OrderAsc(PastAwardType.Columns.AwardYear)
              .ExecuteDataSet();
        }
        else if (names.Length == 2) {
            GridView1.DataSource = new Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*")
              .From(PastAwardName.Schema)
              .InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID)
              .Where(PastAwardName.Columns.LName).IsEqualTo(names[1])
              .And(PastAwardName.Columns.FName).IsEqualTo(names[0])
              .OrderAsc(PastAwardType.Columns.AwardYear)
              .ExecuteDataSet();
        }
    }

Возможно, вы также захотите добавить обработку ошибок / проверку для случая, когда пользователь не вводит значение в текстовое поле или вводит 3 или более слов.

...