【问题标题】:EntityFramework - Load IDs to levels down without loading other columnsEntityFramework - 将 ID 加载到下一级而不加载其他列
【发布时间】:2013-02-28 21:34:45
【问题描述】:

我有 3 个实体:横幅、包和文件。

一个横幅有很多包,一个包有很多文件。

我需要获取所有横幅的所有文件 ID。我尝试了以下方法:

  IList<BannerModel> banners = context.Banners
    .OrderBy(x => Guid.NewGuid())
    .Take(count)       
    .Select(x => 
      new BannerModel {
        Images = x.Packs.SelectMany(p => p.Files.Select(f => f.Id)).ToList()
      }).ToList();

但是,我在选择文件 ID 时遇到错误:

System.NotSupportedException:LINQ to Entities 无法识别 方法'System.Collections.Generic.List1[System.Int32] ToList[Int32](System.Collections.Generic.IEnumerable1[System.Int32])' 方法,并且该方法不能翻译成商店表达式。 在 System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter 父,MethodCallExpression 调用)在 ...

知道可能出了什么问题吗?

注意:我禁用了延迟加载。

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:
    var allFileIDs = context.Banners.SelectMany(b => 
                               b.Packs.SelectMany(p => p.Files.Select(f => f.ID)))
                            .ToList();
    

    生成的 SQL 将如下所示:

    SELECT [t2].[ID]
    FROM [Banners] AS [t0], [Packs] AS [t1], [Files] AS [t2]
    WHERE ([t1].[BannerID] = [t0].[ID]) AND ([t2].[PackID] = [t1].[ID])
    

    没有延迟加载,单个查询。


    误解了您关于获取所有文件 ID 的问题。如果您需要将每个横幅投影到 BannerModel:

    context.Banners.Select(b => new BannerModel {
              Images = b.Packs.SelectMany(p => p.Files.Select(f => f.ID))
            }).ToList();
    

    您看到异常,因为表达式中有ToList(),无法转换为SQL。将BannerModel.Images 更改为IEnumerable&lt;int&gt; 类型而不是List&lt;int&gt;,并从select 语句中删除ToList() 调用。


    如果您不想更改 BannerModel.Images 的类型,还有一个选择:

    context.Banners.Select(b => b.Packs.SelectMany(p => p.Files.Select(f => f.ID)))
                   .ToList() // brings next projection into memory
                   .Select(ids => new BannerModel { Images = ids.ToList() })
                   .ToList();
    

    【讨论】:

    • 不需要 Distinct() 吗?
    • 为什么需要 Distinct?我确定文件 ID 都是不同的......而且无法进行我所做的投影,以便我可以在另一个查询中定义 ImageIds?
    • @Shapper 再次同意 :) 删除了无用的 Distinct()。如果您选择的不是 PK,则需要 Distinct()。在你的情况下没有必要
    • 我更新了我的代码以显示我在寻找什么。您的建议有效,但正如我刚刚发布的那样,我希望将其集成到查询中。但是,我收到了我描述的错误。不能这样做吗?
    • 您的建议无效。这就是我所做的,因为它看起来很合乎逻辑,但我得到了错误: System.NotSupportedException: LINQ to Entities does not identify the method 'System.Collections.Generic.List1[System.Int32] ToList[Int32](System.Collections.Generic .IEnumerable1[System.Int32])' 方法,并且该方法不能翻译成存储表达式。在 System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) at ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多