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

C# 如何获取所有元素,以及它们是否已分配?,c#,linq,entity-framework,C#,Linq,Entity Framework,我有下面的型号 Subscription Packages PackageWidgets Widgets ------------ -------- -------------- ------- ID ID < PackageID ID PackageID > WidgetID > 更新#2 多亏了公认的答案,这就是我最终要做的——这正是我所

我有下面的型号

Subscription    Packages    PackageWidgets    Widgets
------------    --------    --------------    -------
ID              ID        < PackageID         ID
PackageID    >              WidgetID       >
更新#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)
}
谢谢你的帮助

类似于:

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;
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),
    };
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),
    };

不知道它是否有效。但是,如果您有myPackage.Subscriptions等属性,这可能会简化很多。

一种方法是将其拆分,例如:

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;
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),
    };
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),
    };
或者根据ID而不是对象进行操作,例如:

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;
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),
    };
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提示!