如何获取所有元素以及它们是否已分配?

时间:2012-05-10 01:31:17

标签: c# linq entity-framework

我有以下型号。

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

我使用的是Entity Framework 4,而SubscriptionPackage有关系。 PackageWidgets列表有关系。

使用Linq,我试图获取所有 Widgets的列表,以及它们是否包含在当前订阅中。也许是因为我的SQL背景,我只是没有在Linq中看到查询。 SQL将涉及来自Widgets的SELECT,通过订阅,包和PackageWidgets的子选择LEFT JOIN,基于传入的SubscriptionID。

我期望的输出类似于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)
}

感谢您的帮助!

2 个答案:

答案 0 :(得分: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中,您只需使用自己的SQL调用ExecuteStoreQuery

答案 1 :(得分: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;

Dunno如果有效的话。但是,如果你有像myPackage.Subscriptions等属性,这可能会简化很多。