如何使用linqTOsql有效地获取嵌套列表?

时间:2010-09-07 17:42:41

标签: linq-to-sql

我想查询三个表:Streams,Entries和FieldInstances。

我想要获取流中的条目列表。 Stream可以是博客或页面等。条目是流的实际实例,即:“stream:Page entry:Welcome”或“stream:blog entry:news about somthing”。

问题是,每个条目都有通过FieldInstance与之关联的自定义数据字段。 IE:

  

stream:Page   进入:欢迎   fieldInstance:欢迎图像路径

我正在尝试找出获取一个流中所有条目列表的最佳方法,并且还具有与每个条目相关联的自定义字段实例。

我一直在玩这样的代码:

var stream = genesisRepository.Streams.First(x => x.StreamUrl == streamUrl);
IQueryable<StreamEntry> entry = genesisRepository.StreamEntries.Where(x => x.StreamID == stream.StreamID);
IQueryable<FieldInstance> fieldInstances = genesisRepository.FieldInstances.Where(
            // doesn't work because entry is basically returning a collection of some kind.
            // and i can't figure out how to compare a single ID with a list/collection of IDs
            x => x.fiStreamEntryID == entry.Where(e => e.StreamID == stream.StreamID)
        );

这当然不起作用。最初我想要获取流中的所有条目,然后获取流中的所有fieldInstances,然后在我拥有所有内容后,我将使用lambdas显示数据...希望将sql查询dows保持为两个或三个。但我无法弄清楚如何编写linqTOsql只在两三个查询中执行。我一直认为我需要在循环中执行查询以获取每个条目的fieldInstances。

是否有LinqTOsql查询将选择所有fieldInstances,其中StreamEntryID(fk)位于其(fk)StreamID与Stream匹配的条目列表中?

2 个答案:

答案 0 :(得分:1)

抱歉,我在第三个声明中并没有完全了解您要加入的列,但是:

var stream = genesisRepository.Streams.First(x => x.StreamUrl == streamUrl);
IQueryable<StreamEntry> entries = genesisRepository.StreamEntries.Where(x => x.StreamID == stream.StreamID);
IQueryable<FieldInstance> fieldInstances = from entry in entries
    from instance in genesisRepository.FieldInstances
    where entry.entryId == instance.fiStreamEntryID
    select instance;

答案 1 :(得分:0)

这有帮助吗?我仍然是EF的新手,但这就是我对它有所了解......

var results = genesisRepository.FieldInstances
    .Include("StreamEntry.Stream")
    .Where(fi => fi.StreamEntry.Stream.StreamUrl == streamUrl);