如何在Linq to Entities中让navigationproperty上的Select返回一个数组

本文关键字:返回 数组 一个 Select 上的 Linq to Entities navigationproperty 中让 | 更新日期: 2023-09-27 18:04:37

我有以下查询,它编译得很好

query.Select(p => new DataObject() {
    Id = p.Id,
    TaskIds = p.Tasks.Select(t => t.TaskId).ToArray()
});

但以运行时异常

结束

LINQ to Entities不能识别方法System。Guid []ToArrayGuid"方法,且该方法不能转换为存储表达式。

下面是数据对象类

public class DataObject {
    public int Id { get;set; }
    public Guid[] TaskIds { get; set; }
}

我的问题是:如何通过从实体

如何在Linq to Entities中让navigationproperty上的Select返回一个数组

的导航属性中选择返回Guid[]

必须将数组的创建推迟到转换为SQL之后,才能在内存端进行创建。

query.Select(p => new {
    Id = p.Id,
    TaskIds = p.Tasks.Select(t => t.TaskId)
})
.AsEnumerable()  // <-- SQL translation up to here. Anything after is done in-memory
.Select(p => new DataObject() {
    Id = p.Id,
    TaskIds = TaskIds.ToArray()
})

这是因为EF总是尝试将您的linq查询转换为tsql操作。你应该像这样把它存到内存中:

 p.Tasks.ToList().Select(t => t.TaskId).ToArray()