c# - 返回此方法的嵌套 LINQ 无法转换为存储表达式异常

标签 c# linq-to-entities

以下 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 does not recognize the method 'System.Collections.Generic.List`1[KernWcfTest.DataTransferObjects.JobDetailDto] ToList[JobDetailDto](System.Collections.Generic.IEnumerable`1[KernWcfTest.DataTransferObjects.JobDetailDto])' method, and this method cannot be translated into a store expression.

这是两个 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 中一切正常。

有什么想法吗?

干杯

史蒂夫

最佳答案

不要在内部查询(用于 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。

关于c# - 返回此方法的嵌套 LINQ 无法转换为存储表达式异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3800834/

相关文章:

c# - 使用动态属性搜索 LINQ 中的 Where 子句

linq - EFCore 2.2 GroupBy Sum 和 DateDiff

entity-framework - Entity Framework : Querying Child Entities

c# - 程序最小化后不从任务栏检索

c# - 这个foreach中间有个cast,能翻译成linq吗?

c# - 如何检测和管理由加载的 DLL 执行的磁盘/注册表/网络事件?

c# - 泛型继承

c# - 解决 LINQ 查询方法中的方法重载

c# - 如何从 Entity Framework 4 的 LINQ 表达式中执行 Oracle 函数?

c# - Visual Studio 2010 RC Intellisense 不工作