【问题标题】:Nested LINQ returning a this method cannot be translated into a store expression exception返回此方法的嵌套 LINQ 无法转换为存储表达式异常
【发布时间】:2010-09-27 03:01:17
【问题描述】:

以下 LINQ:

retval = ( from jm in entities.JobMasters
                 where jm.UserId == userId && jm.IsRemote == false
                 select new JobDto
                 {
                     JobMasterId = jm.JobMasterId,
                     ExternalTaskId = jm.ExternalTaskId,
                     JobDetails = ( from jd in entities.JobDetails
                                    where jd.JobMasterId == jm.JobMasterId
                                    select new JobDetailDto { ScreenFieldId = jd.ScreenFieldId, FieldValue = jd.FieldValue }
                     ).ToList()
                 }
            ).ToList();

给我这个错误:

LINQ to Entities 无法识别该方法 'System.Collections.Generic.List`1[KernWcfTest.DataTransferObjects.JobDetailDto] ToList[JobDetailDto](System.Collections.Generic.IEnumerable`1[KernWcfTest.DataTransferObjects.JobDetailDto])' 方法, 而且这个方法不能翻译成store表达式。

这是两个 dto 类:

[DataContract]
public class JobDetailDto
{
    [DataMember]
    public int ScreenFieldId { get; set; }

    [DataMember]
    public string FieldValue { get; set; }
}

[DataContract]
[KnownType(typeof(JobDetailDto))]
public class JobDto
{
    [DataMember]
    public int JobMasterId { get; set; }

    [DataMember]
    public string ExternalTaskId { get; set; }

    [DataMember]
    public List<JobDetailDto> JobDetails { get; set; }
}

问题在于子选择和 JobDetails 列表。我尝试添加 KnownType 但它不起作用。

这在 LINQ Pad 中一切正常。

有什么想法吗?

干杯

史蒂夫

【问题讨论】:

    标签: c# linq-to-entities


    【解决方案1】:

    不要在内部查询(用于 JobDetails 的查询)上调用 ToList。错误是“你所说的这个 .ToList 方法——它不能被翻译成 T-SQL!”

    这应该可行:

    retval = ( from jm in entities.JobMasters
                 where jm.UserId == userId && jm.IsRemote == false
                 select new JobDto
                 {
                     JobMasterId = jm.JobMasterId,
                     ExternalTaskId = jm.ExternalTaskId,
                     JobDetails =   from jd in entities.JobDetails
                                    where jd.JobMasterId == jm.JobMasterId
                                    select new JobDetailDto { ScreenFieldId = jd.ScreenFieldId, FieldValue = jd.FieldValue }
                     )
                 }
            ).ToList();
    

    请注意,您可以在查询结束时调用 ToList,因为该部分不需要转换为 T-SQL。

    【讨论】:

    • 我认为你正朝着正确的方向前进,但这让我无法将类型 'System.Linq.IQueryable' 隐式转换为 System.Collections.Generic.List'.
    • 如果将最后一个 .ToList() 更改为 .AsEnumerable().ToList() 会出现什么错误(如果有)?
    • 现在的问题是您的 DTO 不能很好地映射到您的查询。让您的 DTO 接受 IEnumerable,或进行单独的查询。
    • 将 DTO 更改为接受 IEmumerable,现在一切正常。谢谢犹大。
    • Martin - 尝试了您的建议,但没有奏效。与原始问题中的错误相同。
    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2011-04-20
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多