实体框架6使用lambda加入groupjoin

时间:2017-04-12 15:10:38

标签: entity-framework lambda entity-framework-6 asp.net-core-mvc core

所以我需要在GroupJoin上设置Join。我已经google了很多,以找到我的问题的答案,但我找不到它。

在数据库中我有模板。我选择一个模板,其中一个表与项目连接。还有一个包含一行或多行的表,其中的文件链接到该项,即我使用的GroupJoin。那个工作,但现在的问题是,我需要调用表与文件链接到表(并且总是1不多)。

到目前为止,我已经加入了groupjoin,但是该连接根本不起作用:

DataBundle = _context.DataTemplates.Join(_context.DataItems, DataTemplates                        => DataTemplates.Id, DataItems => DataItems.DataTemplateId, (DataTemplates, DataItems) => new { DataTemplates, DataItems })
                               .GroupJoin(_context.DataItemFiles.Join(_context.DataTemplateUploads, DataItemFiles => DataItemFiles.DataTemplateUploadId, DataTemplateUploads => DataTemplateUploads.Id, (DataItemFiles, DataTemplateUploads) => new { DataItemFiles, DataTemplateUploads }), x => x.DataItems.Id, x => x.DataItemFiles.DataItemId, (x, DataItemFiles) => new { x.DataItems, x.DataTemplates, DataItemFiles })
                               .Where(x => x.DataTemplates.CallName == CallName).Where(x => x.DataItems.WebsiteLanguageId == WebsiteLanguageId)
                               .Select(x => new DataBundle()
                               {
                                   DataItemFiles = x.DataItemFiles, //error
                                   DataItemResources = null,
                                   DataItems = x.DataItems,
                                   DataTemplateFields = null,
                                   DataTemplates = x.DataTemplates,
                                   DataTemplateUploads = x.DataTemplateUploads, //can't find, because DataTemplateUploads is linked to DataItemFiles
                               }).ToList();

public class DataBundle
{
    public IEnumerable<DataItemFiles> DataItemFiles { get; set; }
    public IEnumerable<DataItemResources> DataItemResources { get; set; }
    public DataItems DataItems { get; set; }
    public IEnumerable<DataTemplateFields> DataTemplateFields { get; set; }
    public DataTemplates DataTemplates { get; set; }
    public IEnumerable<DataTemplateUploads> DataTemplateUploads { get; set; }
}

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

DataItemFiles变量

(x, DataItemFiles) => new { x.DataItems, x.DataTemplates, DataItemFiles }

实际上是IEnumerable<anonymous_type>,其中anonymous_type是前一个Join运算符new { DataItemFiles, DataTemplateUploads }的结果(顺便说一句,对于大多数名称,你应该使用单数形式,它是&#39} ;真的很难理解哪一个是单一的,哪一个是序列)。

因此,为了获得您需要使用投影(Select)的各个部分:

.Select(x => new DataBundle()
{
    DataItemFiles = x.DataItemFiles.Select(y => y.DataItemFiles),
    // ...
    DataTemplateUploads = x.DataItemFiles.Select(y => y.DataTemplateUploads),
    // ...
}
相关问题