跨关联表选择

时间:2013-02-26 08:07:00

标签: c# .net linq model-associations

鉴于下面的数据模型,我想选择具有调度的每个ConfigurableItem,其中IsActive = true。

enter image description here

我已经看了很多例子:关联表并没有真正得到它们,因为这些例子以某种方式神奇地忽略了多对多关联。似乎有很多建议我应该能够:

var f = from citem in context.ConfigurableItems
        where citem.ConfigurableItemSchedules.Schedule.IsActive == true
        select citem;

但这不是intellisense / compile。我在这里缺少什么?

更新

我使用从服务器资源管理器(sql server)拖放自动生成的.dbml,所以下面是一些自动生成的代码,可能有助于回答一些注释。它们只是截断生成字段的片段。

public partial class ConfigurableItem : INotifyPropertyChanging, INotifyPropertyChanged
    {

        private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

        private long _ConfigurableItemIndexCode;

        private string _ItemRootPath;

        private string _ItemName;

        private string _HandlerAssembly;

        private string _HandlerType;

        private EntitySet<ConfigurableItemProperty> _ConfigurableItemProperties;

        private EntitySet<ConfigurableItemSchedule> _ConfigurableItemSchedules;

...

public partial class ConfigurableItemSchedule : INotifyPropertyChanging, INotifyPropertyChanged
{

    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

    private long _ConfigurableItemIndexCode;

    private long _ScheduleIndexCode;

    private EntityRef<ConfigurableItem> _ConfigurableItem;

    private EntityRef<Schedule> _Schedule; 

2 个答案:

答案 0 :(得分:2)

我认为你需要:

var f = from citem in context.ConfigurableItems
        where citem.ConfigurableItemSchedules.Any(s=>s.Schedule.IsActive)
        select citem;

或类似的东西。

答案 1 :(得分:1)

你正试图达到Schedule但是因为ConfigurableItemSchedules本身有很多行(可能,我认为),编译器无法理解你需要哪个行的时间表。当你在连接中使用导航属性时你应该确保导航属性结束于目标表中的一行,或者您应该使用.SelectMany(t=>...).any()向编译器显示您将选择行的集合,从最底层开始可能更好表格如

var c = (from u in  context.Schedule
                     where u.IsActive == true
                     select u.ConfigurableItemSchedules.ConfigurableItems);