2012-05-10 27 views
2

我有以下的模型。我如何获得所有元素并分配它们?

Subscription Packages PackageWidgets Widgets 
------------ -------- -------------- ------- 
ID    ID  < PackageID   ID 
PackageID >    WidgetID  > 

我使用实体框架4和SubscriptionPackage的关系。而Package具有的Widgets列表的关系。

使用Linq,我试图获得全部Widgets的列表,以及它们是否包含在当前订阅中。也许这是由于我的SQL背景,我只是没有看到Linq中的查询。 SQL将涉及从微一个SELECT,与左通过订阅,数据包和PackageWidgets基于在SubscriptionID传递一个子查询的JOIN。

我期望的输出将是类似于WidgetID,IsIncluded,这样我将拥有所有的Widget ID和一个指示包含状态的布尔值。

我似乎甚至没有远程接近工作的东西,以显示我迄今为止所做的。

谁能为我提供有关如何完成我的查询一些启发?

更新: 这里是我接近的,但它仍然无法正常工作。也许这将有助于说明什么,我想虽然完成:

from subscription in Subscriptions 
where subscription.ID == 3 
let subWidgets = subscription.Package.Widgets 
from widget in Widgets 
join subWidget in subWidgets on widget.ID equals subWidget.ID into joined 
from list in joined.DefaultIfEmpty() 
select new { 
    ID = widget.ID 
    ,Selected = subWidget.ID != null 
} 

更新#2 由于接受的答案,这是我结束了去 - 这不正是我需要:

from widget in Widgets 
from subWidgets in 
    from subscription in Subscriptions 
    where subscription.ID == 3 
    select subscription.Package.Widgets 
orderby widget.ID 
select new { 
    Name = widget.WidgetName, 
    Available = subWidgets.Contains(widget) 
} 

感谢您的帮助!

回答

1

一种方式接近它是打破它,所以像:

var widgetsInSubscription = 
    from subscription in Subscriptions 
    where subscription.ID == 3 
    from widget in subscription.Package.Widgets 
    select widget; 

var allWidgets = 
    from widget in Widgets 
    select new 
    { 
     widget.ID, 
     Selected = widgetsInSubscription.Contains(widget), 
    }; 

或做它基于ID的,而不是对象,是这样的:

var widgetIDsInSubscription = 
    from subscription in Subscriptions 
    where subscription.ID == 3 
    from widget in subscription.Package.Widgets 
    select widget.ID; 

var allWidgets = 
    from widget in Widgets 
    select new 
    { 
     widget.ID, 
     Selected = widgetIDsInSubscription .Contains(widget.ID), 
    }; 

记住你总是可以做自己的查询,如果你想要的 - 在EF4你可以调用ExecuteStoreQuery用自己的SQL

+0

这看起来像它应该工作,但我要在今天路程,不能回来直到后来。感谢ExecuteStoreQuery提示! – BradBrening

0

喜欢的东西:

from s in db.Subscriptions 
from p in db.Packages 
from pw in db.PackageWidgets 
from w in db.Widgets 
where w.ID == pw.WidgetID && 
     pw.PackageID == p.ID && 
     s.PackageID == p.ID 
select w; 

说不上它是否工作虽然。但是,如果你有像myPackage.Subscriptions等属性,这可能会被简化很多。

相关问题