2012-12-02 2 views
1

Je suis un débutant à C# et je construis une application qui contient le contenu d'une bibliothèque (livres et revues).convertir le dictionnaire en une requête linq

Je construis un programme à trois niveaux avec UI, BLL et DAL. Ce que j'essaye de faire est d'obtenir le texte d'une liste déroulante et de le convertir (finalement) dans mon DAL à une requête de Linq à SQL. J'ai créé une base de données locale et l'ai mappée avec le framework Entity.

Je le code suivant:

BL.MainLogic BLL = new MainLogic(); 
Dictionary<string, string> searchList = new Dictionary<string, string>(); 
searchList.Add("ItemID", cmboBxItemID.Text); 
searchList.Add("ItemName", cmboBxItemName.Text); 
searchList.Add("ItemType", cmboBxItemType.Text); 
searchList.Add("Author", cmboBxAuthor.Text); 
searchList.Add("Publisher", cmboBxPublisher.Text); 
searchList.Add("Price", cmboBxPrice.Text); 
DataTable searchResult = BLL.Search(searchList); 
searchGridView.DataSource = searchList; 

Je crée un dictionnaire avec le nom de la colonne et la valeur à rechercher par et je transmettre à la BL:

public DataTable Search(Dictionary<string,string> SearchParams) 
{ 
    var itemType = SearchParams.FirstOrDefault(x => x.Key == "ItemType"); 
    IQueryable query = SearchParams.AsQueryable(); 
} 

maintenant, ce que je suis en train de faire est de créer une requête de toutes les clés & valeurs dans le dictionnaire dans le format de:

== Valeur clé.

Comment puis-je faire cela d'une meilleure manière? Devrais-je même utiliser un dictionnaire pour ce type d'action?

+1

Peut-être que ce lien peut vous aider: [Dynamic LINQ] (http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query -library.aspx) –

+0

merci, j'ai fini par passer des valeurs avec une classe j'ai créé, mais merci pour cela! :) –

+0

@yuvalos si vous avez résolu votre problème s'il vous plaît poster votre résolution et accepter. – emd

Répondre

0

Ce que j'ai fait, j'ai fini par créer une maquette de mes entités de base de données que mon interface utilisateur peut voir (appelé BookVO) Lorsque l'utilisateur insère des données dans les comboboxes, j'insère ces données dans un BookVO, passe ça sur mon BL qui le transmet plus tard à mon dal. Ensuite, je recherche mon contexte EF en utilisant ce même livre.

c'est là que j'ajoute le livre:

private BookVO AddNewBook() 
{ 
    BookVO bookToAdd = new BookVO() 
    { 
     Author = txtBxBookAuthor.Text, 
     Discount = double.Parse(txtBxBookDiscount.Text), 
     Genre = txtBxBookGenre.Text, 
     ISBN = txtBxBookISBN.Text, 
     Name = txtBxBookName.Text, 
     Price = double.Parse(txtBxBookPrice.Text), 
     Publisher = txtBxBookPublisher.Text, 
     ReleaseDate = DateTime.Parse(dateTimeBookPicker.Text) 
    }; 
    return bookToAdd; 

ceci est ma part de BL qui passe le livre à mon DAL

public List<BookVO> SearchBook(BookVO book) 
{ 
    List<Books> queryResult = BLDAL.SelectBookFromDB(book); 
    List<BookVO> returnedBook = new List<BookVO>(); 
    foreach (Books dBBook in queryResult) 
    { 
     BookVO thisBook = new BookVO() {Author = dBBook.Author, Name = dBBook.Name, ISBN = dBBook.BookISBN, Discount = dBBook.Discount, Price = dBBook.Price, Publisher = dBBook.Publisher, ReleaseDate = dBBook.ReleaseDate}; 
     returnedBook.Add(thisBook); 
    }; 
    return returnedBook; 
} 

c'est ma logique DAL pour la recherche:

public List<Books> SelectBookFromDB(BookVO book) 
{ 
    var result = myEntities.Books.ToList(); 
    if (string.IsNullOrWhiteSpace(book.Author) == false) 
    { 
     result = result.Where(x => x.Author == book.Author).ToList(); 
    } 
    if (string.IsNullOrWhiteSpace(book.Name) == false) 
    { 
     result = result.Where(x => x.Name == book.Name).ToList(); 
    } 
    if (string.IsNullOrWhiteSpace(book.Publisher) == false) 
    { 
     result = result.Where(x => x.Publisher == book.Publisher).ToList(); 
    } 
    if (string.IsNullOrWhiteSpace(book.ISBN) == false) 
    { 
     result = result.Where(x => x.BookISBN == book.ISBN).ToList(); 
    } 
    if (book.Price != 0) 
    { 
     result = result.Where(x => x.Price == book.Price).ToList(); 
    } 
    if (book.Discount != 0) 
    { 
     result = result.Where(x => x.Discount == book.Discount).ToList(); 
    } 

    return result; 
} 
Questions connexes