2

我有以下模型。

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

我正在使用 Entity Framework 4,并且 aSubscriptionPackage. 并且Package与一个列表有关系Widgets

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

我期望的输出将是WidgetID,IsIncluded这样的,即我将拥有所有小部件 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)
}

感谢您的协助!

4

2 回答 2

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

于 2012-05-10T03:35:50.460 回答
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 等属性,这可能会简化很多。

于 2012-05-10T01:41:46.550 回答