Question

Le cadre de l'application web, je suis en train de travailler sur une zone de l'affichage des messages de gestion à 1...n utilisateurs.J'ai un DataAccess projet qui contient les classes LINQ to SQL, et un projet de site web qui est l'INTERFACE utilisateur.Ma base de données ressemble à ceci:

Utilisateur -> MessageDetail <- Message <- MessageCategory

MessageDetail est une table de jointure qui contient également un IsRead drapeau.

La liste des messages sont regroupés par catégorie.J'ai deux imbriqués contrôles de liste sur la page -- l'Une des sorties du nom du groupe, tandis qu'un deuxième imbriquées à l'intérieur qui est lié à MessageDetails et sorties les messages eux-mêmes.Dans le code-behind de la page listant les messages que j'ai le code suivant:

protected void MessageListDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
    var db = new DataContext();

    // parse the input strings from the web form
    int categoryIDFilter;
    DateTime dateFilter;
    string catFilterString = MessagesCategoryFilter.SelectedValue;
    string dateFilterString = MessagesDateFilter.SelectedValue;
    // TryParse will return default values if parsing is unsuccessful (i.e. if "all" is selected"):
    // DateTime.MinValue for dates, 0 for int
    DateTime.TryParse(dateFilterString, out dateFilter);
    Int32.TryParse(catFilterString, out categoryIDFilter);
    bool showRead = MessagesReadFilter.Checked;

    var messages =
        from detail in db.MessageDetails
        where detail.UserID == (int)Session["UserID"]
        where detail.Message.IsPublished
        where detail.Message.MessageCategoryID == categoryIDFilter || (categoryIDFilter == 0)
        where dateFilter == detail.Message.PublishDate.Value.Date || (dateFilter == DateTime.MinValue)
        // is unread, showRead filter is on, or message was marked read today
        where detail.IsRead == false || showRead || detail.ReadDate.Value.Date == DateTime.Today
        orderby detail.Message.PublishDate descending
        group detail by detail.Message.MessageCategory into categories
        orderby categories.Key.Name
        select new
        {
            MessageCategory = categories.Key,
            MessageDetails = categories.Select(d => d)
        };

    e.Result = messages;
}

Ce code fonctionne, mais coller une énorme LINQ déclaration de ce type dans le code-behind pour un LinqDataSource de contrôle n'a tout simplement pas de s'asseoir avec moi.

Il me semble que je suis toujours à la codification dans l'interface utilisateur, seulement maintenant il LINQ au lieu de SQL.Cependant, je pense que la création d'une autre couche entre le L2S les classes et l'INTERFACE utilisateur permettrait de réduire certaines de la flexibilité de LINQ.N'est-ce pas le point entier de réduire la quantité de code à écrire pour récupérer les données?

Est-il un terrain d'entente, je ne suis pas voyant, ou suis-je juste de l'incompréhension de la façon LINQ to SQL est censé être utilisé?Des conseils seraient grandement appréciés.

Était-ce utile?

La solution

Tous vos LINQ des requêtes sur devrait être dans un classe de logique métier, aucun changement à partir d'anciennes méthodes comme ADO.

Si vous êtes un puriste vous devez toujours revenir List(of T) à partir de vos méthodes dans la classe d'affaires, en fait, le datacontext ne doit être visible pour les classes d'affaires.Ensuite, vous pouvez manipuler la liste dans l'interface utilisateur.

Si vous êtes un pragmatique, vous pouvez retourner un IQueryable de l'objet et de faire quelques manipulations dans l'interface utilisateur.

Autres conseils

Indépendamment de LINQ, je pense que le code de présentation de la base de données-relaed code n'est pas une bonne idée.Je voudrais créer un simple DB couche d'abstraction sur les requêtes LINQ.À mon avis, LINQ est juste un outil pratique, qui n'a pas un impact sérieux sur la traditionnelle conception de l'application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top