【问题标题】:Creating Union fail with Entity framework使用实体框架创建联合失败
【发布时间】:2013-10-21 19:18:59
【问题描述】:

我想在实体框架中合并两个列表。在一个联合部分,我有一个集合,而在另一个集合中,集合是空的。我正在尝试将集合清空,但它不起作用...

var query = Context.Assignments.AsQueryable();
var workItemQuery = Context.WorkItems.AsQueryable();

var assigments = query.Select(o => new WorkItemAssignment()
            {
                EndDate = o.WorkItem.EndDate,
                StartDate = o.WorkItem.StartDate,
                IsExternal = o.Resource.IsExternalEmp ? Resources.External : Resources.Internal,
                ResourceAssignedName = o.Resource.FirstName + " " + o.Resource.LastName,
                RoleName = o.Role.Name,
                Specialties = o.AssignmentSpecialties.Select(a => a.Specialty.Name),
                WorkItemName = o.WorkItem.Name,
                WorkItemOwner = o.WorkItem.OwnerResource.FirstName + " " + o.WorkItem.OwnerResource.LastName,
                WorkItemStatus = o.WorkItem.WorkItemStatus.Name,
                Days = o.Days.Value,
                Percentage = o.Percentage.Value,
                RequestId = o.WorkRequestAllocationId != null && o.WorkRequestAllocationId != Guid.Empty ? o.WorkRequestAllocation.WorkRequest.RequestId : (int?) null
            });

var  workItemAssignments = workItemQuery.Select(o => new WorkItemAssignment()
            {
                EndDate = o.EndDate,
                StartDate = o.StartDate,
                IsExternal = "N/A",
                ResourceAssignedName = "N/A",
                RoleName = "N/A",
                RoleProficiency = "N/A",
                Specialties = Enumerable.Empty<string>().AsQueryable(), //DO NOT WORK !!!
                WorkItemName = o.Name,
                WorkItemOwner = o.OwnerResource.FirstName + " " + o.OwnerResource.LastName,
                WorkItemStatus = o.WorkItemStatus.Name,
                Days = null,
                Percentage = null,
                RequestId = null
            });
return assigments.Union(workItemAssignments);

错误信息:

LINQ to Entities 无法识别该方法 'System.Collections.Generic.IEnumerable`1[System.String] EmptyString' 方法,并且该方法不能翻译成 存储表达式。

当我从我的 2 个查询中删除属性“Specialities”时,它可以工作...

编辑:

由于第一个答案,我想澄清一下,我确实需要留在实体上下文中以保留我的 IQueryable 而不会实现我的列表。我的剑道网格正在做一些过滤/分页,我想给它发送IQueryable

更新 2:

使用@Moho 的解决方案后,它只是缺少一个IEqualityComparer,它使我的集合无法在两个查询之间进行比较。

return assigments.Union(workItemAssignments ,assignmentEqualityComparer);

【问题讨论】:

  • 是否可以选择不设置该属性并让它为空,或者其他任何默认值?
  • 我添加了 workItemQuery。之后还有一些过滤,但在这种情况下,它并不是很重要。
  • @Servy 不,我不能这样做,我收到另一条错误消息:“类型‘WorkItemAssignment’出现在单个 LINQ to Entities 查询中的两个结构不兼容的初始化中。类型可以是在同一个查询中的两个地方初始化,但前提是在两个地方都设置了相同的属性并且这些属性以相同的顺序设置。”

标签: c# linq entity-framework iqueryable


【解决方案1】:

Linq to Entities 提供程序在尝试将您的查询转换为 SQL 时不知道如何处理 Enumerable.Empty&lt;T&gt;()

更新:

我相信这应该可行:

Specialties = new string[]{}.AsQueryable()

【讨论】:

  • 我真的不需要我的 IQueryable,因为我的剑道网格正在进行过滤,我不想在过滤完成之前生成查询
  • 而且我知道提供者不知道什么是“Enumerable.Empty”我可以阅读错误消息。我只需要另一种方法来做一个空列表来强制合并 2 个查询
  • 它确实改变了错误信息。但它仍然不起作用。当我从我的 2 查询中删除属性“Specialities”时,它可以工作......这是新消息:“'Distinct' 操作不能应用于指定参数的集合 ResultType。参数名称:参数”
  • 终于成功了,我只是添加创建一个新的genericEqualityComparer。并从比较中删除了我的收藏。
猜你喜欢
  • 1970-01-01
  • 2011-08-24
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
相关资源
最近更新 更多