2012-05-10 9 views
2

私は以下のモデルを持っています。すべての要素を取得する方法と割り当てられている場合

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

私は、Entity Frameworkの4を使用していますし、SubscriptionPackageとの関係を持っています。 PackageWidgetsのリストとの関係を持っています。 LINQのを使用して

、私はすべてWidgetsのリストを取得しようとしていますし、彼らは現在のサブスクリプションに含まれている場合。おそらく、Linqでクエリが表示されていないという私のSQLバックグラウンドによるものです。 SQLには、WidgetsのSELECTが含まれ、渡されたSubscriptionIDに基づいてサブスクリプション、パッケージおよび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) 
} 

ありがとうございました!

答えて

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

あなたが望むならあなたはいつでもあなた自身の質問をすることができます - あなた自身のSQLでExecuteStoreQueryを呼び出すことができます

+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などのプロパティを使用していた場合、これはおそらく単純化される可能性があります。

関連する問題