2010-05-11 5 views
0

J'ai deux tables dans lesquelles j'essaie de créer une relation afin de pouvoir écrire de belles requêtes LINQ qui ne nécessitent pas de jointure.Définition des relations SQL pour les requêtes LINQ

Widgets 
WidgetId 
WidgetDescription 

Orders 
OrderId 
WidgetId 
OrderDate 

Ce que je veux être en mesure de faire est de créer une requête LINQ qui fait quelque chose de similaire à:

var result = from x in db.Widgets 
Where x.Orders.OrderDate == "5/11/2010" 
select x; 

Je ne peux pas sembler obtenir intellitext pour ramasser l'autre base de données, malgré la création d'un relation dans le serveur SQL. Y a-t-il d'autres étapes à suivre pour que cela fonctionne?

Répondre

0

Je ne pense pas que cela puisse être fait sans ajouter OrderDate à Widgets dans votre base de données, ou en exécutant une requête de jointure avant de l'interroger.

Je ferais quelque chose comme ça.

var firstQuery = (for w in Widgets 
        join o in Orders 
        on w.WidgetId equals o.WidgetID 
        select new {Widgets = w, OrderDate = o.OrderDate}).Distinct(); 

var secondQuery = for record in firstQuery 
        where record.OrderDate == "5/11/2010" 
        select record.Widgets; 

De cette façon, vous obtenez un OrderDate pour chaque enregistrement Widget.

+0

Parce que les deux tableaux sont associés par WidgetId, serait d'ajouter à OrderDate Widgets redondant? Je regarde des exemples comme ceci: (http://weblogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-3-querying-our-database.aspx) et sentez comme si tout était pareil, mais je n'arrive pas à le faire fonctionner. – sooprise

+0

Je le divisais en deux requêtes pour vous montrer ce qu'il faisait. Mais vous pouvez tout faire en une seule requête de jointure. Vous venez de dire que vous vouliez le faire sans une jointure, je montrais comment vous pourriez créer un Enumerable rapide qui vous donnerait la capacité de le faire. – jsmith

0

Que diriez-vous quelque chose comme:

var result = from widgetId in 
       (from order in orderContext.Orders 
        where order.OrderDate == new DateTime(2010, 5, 11) 
        select order.WidgetId) 
      from widget in widgetContext.Widgets 
      where widget.WidgetId = widgetId 
      select widget; 
Questions connexes