2012-05-10 2 views
2

У меня есть следующая модель.Как получить все элементы и назначить их?

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

Я использую Entity Framework 4 и Subscription имеет отношения к Package. И Package имеет отношение к списку Widgets.

Используя Linq, я пытаюсь получить листинг всеWidgets и если они включены в текущую подписку. Возможно, из-за моего фона SQL я просто не вижу запроса в Linq. SQL будет включать SELECT из виджетов с LEFT JOIN через подзаголовок Subscriptions, Packages и PackageWidgets на основе переданного в SubscriptionID.

Результат, который я ожидал бы, был бы чем-то вроде WidgetID,IsIncluded, так что у меня были бы все идентификаторы виджетов и логическое значение, указывающее статус включения.

Кажется, я даже не могу получить что-то отдаленно близко к работе, чтобы показать, что я сделал до сих пор.

Может ли кто-нибудь предоставить мне некоторые сведения о том, как выполнить мой запрос?

Обновление: Вот что я сблизил, но он по-прежнему не работает. Может быть, это поможет проиллюстрировать то, что я пытаюсь сделать, хотя:

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 
} 

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

Или делать это на основе идентификаторов вместо объектов, что-то вроде:

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 вы можете просто позвонить ExecuteStoreQuery со своим собственным SQL

+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 и т. Д., Это, вероятно, может быть упрощено.

Смежные вопросы