2

私は次のモデルを持っています。

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

私はEntityFramework4を使用してSubscriptionいますが、との関係がありPackageます。そしてPackage、のリストとの関係がありWidgetsます。

Linqを使用して、すべて Widgetsのリストを取得しようとしています。それらが現在のサブスクリプションに含まれているかどうかを確認します。おそらく、Linqでクエリが表示されないのは、SQLのバックグラウンドが原因です。SQLには、ウィジェットからのSELECTが含まれ、SubscriptionIDで渡されたものに基づいて、Subscriptions、Packages、およびPackageWidgetsのサブセレクトを介したLEFTJOINが含まれます。

私が期待する出力は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

それにアプローチする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;

それがうまくいくなら、Dunno。ただし、myPackage.Subscriptionsなどのプロパティがある場合、これはおそらく大幅に簡略化される可能性があります。

于 2012-05-10T01:41:46.550 に答える