【问题标题】:Entity framework 6 join on a groupjoin using lambda实体框架 6 使用 lambda 加入 groupjoin
【发布时间】:2017-04-12 15:10:37
【问题描述】:

我需要在 GroupJoin 上设置一个 Join。我用谷歌搜索了很多关于我的问题的答案,但我找不到它。

在数据库中我有模板。我选择了一个带有项目的表格的模板。还有一个表,其中包含一行或多行的文件链接到该项目,即我使用的 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; }
}

有人知道怎么解决吗?

【问题讨论】:

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


【解决方案1】:

DataItemFiles 变量在这里

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

实际上是IEnumerable&lt;anonymous_type&gt;,其中anonymous_type 是前一个Join 运算符new { DataItemFiles, DataTemplateUploads } 的结果(顺便说一句,您应该对大多数名称使用单数形式,很难区分哪个是单数,哪个是单数)一个是序列)。

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

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

【讨论】:

  • 我不确定你的意思:(顺便说一句,你应该对大多数名称使用单数形式,很难区分哪个是单数,哪个是序列)。但你的答案有效
猜你喜欢
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多