如何在Guid中使用Contains

本文关键字:Contains Guid | 更新日期: 2023-09-27 18:04:11

我试图从集合内的上下文中获取所有实体。它是这样工作的:

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

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

编辑

NotSupportedException

无法创建类型的常数值DataObjects.KeyValueDataObject 2[[系统。Guid, mscorlibVersion = 4.0.0.0、文化=中立,都必须要]、[系统。字符串,mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]]。这里只支持基本类型或枚举类型上下文。

和类

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

实现为KeyValueDataObject<Guid,String>

如何在Guid中使用Contains

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

尝试先将查找提取到一个"常量"列表中:

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

试试这个:

var taskIds = message.Tasks.Select(t => t.Id).ToArray();
context.Tasks.Where(p => taskIds.Any(t => t.Id == p.Id));

试试这个:

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

我希望这有帮助

代码编辑