1

我正在尝试从集合中的上下文中获取所有实体。虽然它以这种方式工作:

Ticket ticket = context.Tickets.Where(p => p.TicketId == ticketId);
ticket.Tasks.Where(p => !message.Tasks.Select(t => t.Id).Contains(p.Id));

它以这种方式以异常结束

context.Tasks.Where(p => message.Tasks.Select(t => t.Id).Contains(p.Id));

请注意Id是类型Guid

我的问题是如何编写第二个查询以从 message.Tasks 集合中的上下文中获取所有任务?

编辑

不支持异常

无法创建类型为 'DataObjects.KeyValueDataObject`2[[System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]]'。此上下文仅支持原始类型或枚举类型。

和班级

public class KeyValueDataObject 
{ 
    public TKey Id { get; set; } 
    public TValue Name { get; set; } 
}

实施为KeyValueDataObject<Guid,String>

4

3 回答 3

4

问题是 Linq-to-Entities 需要将您的列表转换为常量表达式才能将您Contains转换为IN语句,这可能不适用于 GUID

尝试首先将查找提取到“常量”列表中:

var lookup = message.Tasks.Select(t => t.Id).ToList();
context.Tasks.Where(p => lookup.Contains(p.Id));
于 2014-05-19T21:20:54.270 回答
1

尝试这个:

var taskIds = message.Tasks.Select(t => t.Id).ToArray();
context.Tasks.Where(p => taskIds.Any(t => t.Id == p.Id));
于 2014-05-19T21:15:15.083 回答
1

试试这个:

var tasks = context.Tasks.ToList().Where(p => message.Tasks.ToList().Any(t => t.Id.Contains(p.Id)));

我希望这有帮助

代码已编辑

于 2014-05-19T21:05:13.177 回答