Recherche de Texte intégral avec LINQ
Salut et merci à l'avance,
Je suis en train de mettre en œuvre une fonction de recherche où les résultats pourraient être remplie dans un Gridview. Je suis à l'aide de LINQ to requête de ma db en c#.
Le problème je suis à essayer de comprendre, si l'utilisateur souhaitez faire une recherche dans plusieurs colonnes/champs avec plus d'un terme de recherche, puis comment dois-je faire? Donc exemple si je recherche une table avec ces 3 champs et j'ai eu quelques données comme:
firstName | lastname | players#
- Michael | Jordan | 12
- Michael | Jordan | 24
- Michael | Jordan | 45
- DeAndre| Jordan | 6
- Jérôme| Jordan | 44
- Jordan| Des Étincelles| 88
Maintenant, si je recherche pour les Jordan, je reçois tout:
Si je recherche Michael Jordan que je devrais obtenir ligne #s 1,2,3 dos.
Si je recherche la Jordanie Étincelles 88 que je devrais en ligne # 6 dos.
Donc mon problème est que je ne sais pas où dans le tableau, le terme de recherche peut être si je doit rechercher toutes les colonnes/champs. Dans mon code, j'ai quelque chose où je vais par chaque colonne/nom du champ et utilisez le Contient() alors || ("ou"), mais elle ne fonctionne que pour 1 terme de recherche.
Est-il un élégant et facile de rechercher et filtrer à travers un ensemble de linq table, de sorte que la liste est réduite au minimum? À partir de là, je vais ajouter que suite à une source de données, puis de les lier.
@Sphinxxx je suis à l'aide d'un typique gridview. Il ressemble à ceci:
<asp:GridView ID="GridView" runat="server" AllowSorting="True" PagerStyle-Mode="NumericPages"
AutoGenerateColumns="false" Width="100%" CssClass="gridView" OnPageIndexChanging="GridView_PageIndexChanging"
AllowPaging="True" DataKeyNames="idPlayersList" OnRowCommand="GridView_RowCommand"
OnRowEditing="GridView_RowEditing" OnRowCancelingEdit="GridView_CancelEditRow"
OnRowUpdating="GridView_UpdateRow" OnRowDataBound="GridView_RowDataBound">
<RowStyle CssClass="rowStyle"></RowStyle>
<asp:BoundField DataField="FirstName" HeaderText="First Name" SortExpression="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="Last Name" SortExpression="LastName" />
<asp:BoundField DataField="PlayersNumber" HeaderText="Players Number" SortExpression="PlayersNumber" />
<asp:TemplateField HeaderText="Team" SortExpression="Team">
<EditItemTemplate>
<asp:DropDownList ID="ddlTeam" runat="server" CssClass="dropdown" AutoPostBack="True"
AppendDataBoundItems="true" DataTextField="TeamName" DataValueField="idTeam">
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblTeam" runat="server" Text='<%# Bind("TeamName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Ma fonction de recherche ressemble à quelque chose comme ceci:
/**
* This method is for button search functionality
*
*/
protected void btnSearch_Click(object sender, EventArgs e)
{
//Call to Entity Model Framework
DBModel.DBEntities context = new DBModel.DBEntities();
string[] searchTerms = txtSearch.Text.Trim().Split('&');
//Prepare to build a "players" query:
IQueryable<DBModel.playersList> playersListQuery = context.playersLists;
foreach (var term in searchTerms)
{
//Refine our query, one search term at a time:
playersListQuery = playersListQuery.Where(p => p.isDeleted == false && (p.FirstName.Contains(term.Trim()) ||
p.LastName.Contains(term.Trim()) ||
p.PlayersNumber.Contains(term.Trim()) ||
p.Team.Name.Contains(term.Trim())));
}
//Now we have the complete query. Get the results from the database:
var filteredplayersList = playersListQuery.Select(s => new
{
idPlayersList = s.idPlayersList,
FirstName = s.FirstName,
LastName = s.LastName,
PlayersNumber = s.PlayersNumber,
TeamName = s.Team.Name
}).ToList();
GridView.DataSource = filteredplayersList; //Connecting query to the datasource Gridview
GridView.DataBind(); //Binding Gridview
}
OriginalL'auteur user2533789 | 2013-07-01
Vous devez vous connecter pour publier un commentaire.
Heureusement, la création de multiples ANDs (un pour chaque terme de recherche) est facile à Linq2SQL - juste continuer à ajouter de la
.Where(..
à votre requête:Non, c'est la beauté de Linq2SQL: Le
foreach
boucle seulement prépare une requête (unIQueryable
). La table de base de données n'est effectivement consultés lorsque vous demandez pour les éléments dans l'IQueryable
, qui se trouve implicitement dans l'appel à.ToArray()
à la fin. Exécutez le code et de regarder lasql
string - il n'y a qu'une seule requête SQL (avec un nombre X de ET consolidés).Que faire si j'ai eu une clé étrangère (fk) à l'une des Équipes de la table. N'aurais-je pas juste pour faire quelque chose comme: playersQuery = playersQuery.Où(p => p.prénom.Contient(durée) || p.lastName.Contient(durée) || p.playersNum.Contient(durée) || p.Équipes.Nom.Contient(à terme));
> Si si, j'obtiens un message d'erreur semblable à ceci: Sys.WebForms.PageRequestManagerServerErrorException: Sys.WebForms.PageRequestManagerServerErrorException: Liaison De Données: 'DBModel.Les joueurs "ne contient pas une propriété avec le nom "TeamName'. Je suis en train de le lier à un gridview. GridView.DataSource = filteredRangeList; GridView.DataBind();
1: Oui, le FK requête doit fonctionner de la façon dont vous avez écrit. 2: je ne fais que deviner, mais que l'erreur semble venir de l'
GridView
, pas la requête sql. Est la grille, mis en place avec une colonne qui ressemble à un "TeamName" propriété? Si oui, leDBModel.Players
classe doit avoir une propriété appelée "TeamName". Quel genre deGridView
est-ce? WinForms?OriginalL'auteur Sphinxxx