如何使用Guid包含?

时间:2014-05-19 20:58:48

标签: c# .net entity-framework entity-framework-6.1

我试图从集合中的上下文中获取所有enities。虽然它以这种方式工作:

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集合中的上下文中获取所有任务?

修改

NotSupportedException异常

  

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

和班级

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

已实施为KeyValueDataObject<Guid,String>

3 个答案:

答案 0 :(得分:3)

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

尝试将查找提取到&#34;常量&#34;首先列出:

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

答案 1 :(得分:1)

试试这个:

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

我希望这个帮助

code EDITED

答案 2 :(得分:1)

试试这个:

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