2010-08-04 9 views
0

J'utilise les services RIA avec l'entité je l'à carcasses instruction select SQL suivante:LINQ to Entity RIA Syntaxe de requête?

select * from TaskTable t, MapTable mt où mt.SiteID = 1 et t.EndPointID = mt.EndPointID

Comment est-ce que j'écris ceci using des requêtes de méthode et lamda, ou n'importe quelle autre manière que je peux employer dans mes services de domaine?

Tous les exemples que je vois renvoient un nouvel objet - dois-je vraiment faire cela? Je pensais que ce serait une chose assez simple mais je n'ai pas encore trouvé la solution.

Je veux faire quelque chose comme:

public void IQueryable<Task> GetTasksFromID(int id) 
{ 
    return this.ObjectContext.TaskTable.Where(e => e.SiteID=id)...???? 
} 

Répondre

1

Vous ne avez de mettre une projection à la fin normalement - mais il semble que vous avez deux tables impliquées. Votre requête SQL retire toutes les colonnes, y compris celles de la table de carte. Si vous voulez seulement les tâches, vous n'en avez pas besoin. Essayez ceci:

return from task in ObjectContext.TaskTable 
     join map in ObjectContext.MapTable 
     on task.EndPointID equals map.EndPointID 
     where map.SiteID == id 
     select task; 

(. J'ai basez la requête sur le SQL plus que le LINQ vous avez fourni - à partir de SQL il ressemble à SiteID fait partie de la carte plutôt que la tâche)

vous pouvez écrire ce en notation point au lieu comme une expression de requête, mais il est plus laid:

return Object.ContextTable.Join(ObjectContext.MapTable 
              .Where(map => map.SiteID = id), 
           task => task.EndPointID, 
           map => map.EndPointID, 
           (task, map) => task); 

(Notez que j'ai déplacé la clause Where ici car il finit par être plus simple avant la se joindre à cette Vous pourriez faire la même chose dans la requête d'expression de requête aussi, mais encore une fois il ne serait pas l'air aussi belle.)

1

En supposant que vous avez une association standard entre Task et Site et que le site PK est appelé SiteID, vous n'avez pas besoin join du tout . Vous venez de faire:

public void IQueryable<Task> GetTasksFromID(int id) 
{ 
    return this.ObjectContext.TaskTable.Where(e => e.Site.SiteID=id); 
} 
+0

Je ne sais pas comment faire pour que cela fonctionne - je vois où vous allez. Mais quand je fais e.Site, je n'ai pas accès à SiteID. – Nicros

+0

Que * as-tu? –

+0

J'ai le MapTable qui a SiteID et EndPointID, et la table de tâches qui a EndPointID. Fondamentalement, j'ai juste besoin d'obtenir les EndPointID à partir du MapTable qui matche SiteID, et récupérer toutes les entités Task avec ces EndPointIDs. – Nicros