2010-08-29 9 views
0

J'ai une simple application d'évaluation d'un article. Il y a trois tableaux principaux:LINQ Union Column Si Authentifié

Item 
{ 
    ItemID, 
    Contents 
} 

asp_User 
{ 
    UserID, 
    Name 
} 

Rating 
{ 
    RatingID, 
    ItemID, 
    UserID, 
    int Rating 
} 

Je code LINQ qui lit les articles:

var q = from item db.Item 
     select item; 

Je voudrais ensuite ajouter à la colonne qa qui contient la note pour chaque ligne d'article du authentifié utilisateur. Si l'utilisateur n'est pas connecté ou s'il n'y a aucune évaluation fournie par l'utilisateur authentifié, le résultat sera 0.

J'utilise le SqlMembershipProvider si cela est important.

Exemple

Le résultat final de q devrait ressembler à ceci:

[assermentée]

//The currently authenticated user has commented on Item.ID = 1 and has given it a 9. 
q = {ID = 1, Contents = "Whatever", Rating = 9}, 

//The currently Authenticated user has not commented on Item.ID = 2. 
{ID = 2, Contents = "Something", Rating = 0}; 

[Non assermentée]

//There is not an authenticated user 
q = {ID = 1, Contents = "Whatever", Rating = 0}, 

//There is not an authenticated user 
{ID = 2, Contents = "Something", Rating = 0}; 

Répondre

0

Que comptez-vous faire avec "var q"? Il est difficile de dire quelles sont vos intentions de la question, et dans ce cas, cela compte beaucoup. Voici le meilleur que je peux faire basé sur le manque de contexte. Espérons que cela aidera:

if(User.IsAuthenticated) 
{ 
    var q = from item in db.Item 
      join r in db.Rating on c.Id equals r.ItemId 
      select new {ID = item.Id, Contents = item.Contents, Rating = r.Rating}; 

    // Do whatever you want with this here. 
} 
else 
{ 
    var y = db.Item; 

    // Do whatever you want with this here. 
} 
0

A partir d'une solution Ocelots en perspective de performance est la voie à suivre (surtout si vous interrogez plusieurs articles). Mais pour satisfaire à la condition que la cote devrait être une propriété de l'article, vous pourriez étendre la classe d'objet en utilisant une classe partielle dans le même espace de noms de vos classes de données LINQ to SQL:

public partial class Item 
{ 
    public int Rating 
    { 
     get 
     { 
      if (!Thread.CurrentPrincipal.Identity.IsAuthenticated) 
       return 0; 

      using (var db = new ApplicationDataContext()) 
      { 
       return db.Item 
        .Where(r => r.ItemID == this.ItemID 
         && r.UserID == Thread.CurrentPrincipal.Identity.Name) 
        .Select(r => r.Rating) 
        .SingleOrDefault(); 
      } 
     } 
    } 
} 

Si vous voulez Pour obtenir les mêmes résultats avec une seule requête SQL comme Ocelot a proposé, vous devriez plutôt utiliser GroupJoin (fonctionne comme un SQL LEFT OUTER JOIN) et sélectionnez l'évaluation actuelle des utilisateurs comme je le fais ci-dessus.