2012-06-26 27 views
3

我有以下情况: “对话”实体/表具有多个与其关联的标签。 标签也是一个实体/表 - 键/ id是tagName(一个字符串)。选择具有所有给定标签的EF实体(其中标签是EF实体)

在客户端(javascript)我处理标记时使用字符串数组。

现在我想要检索所有所有给定标签的对话。


输入是一个字符串数组和输出应该是对话的集合

我已经试过:

var filterTags = new List<EFModels.Tag>(); 
foreach (var tagName in tags) 
      { 
       filterTags.Add(new EFModels.Tag() { Name = tagName}); 
      } 

var conversations = from c in context.Conversations where !c.Tags.Except(filterTags).Any() select c ; 

的问题,这就是:Unable to create a constant value of type 'EFModels.Tag'. Only primitive types or enumeration types are supported in this context - 这使得感。

现在我该如何做我的选择?什么是最好的方法? (我仍然想使用linq,而不是写入sql select)

回答

1

您可以将c.Tags投影到标签名称。

我想这会看起来像

var conversations = from c in context.Conversations where !c.Tags.Select(tag => tag.Name).Except(filterTags).Any() select c ; 

哪里filterTags是包含标签

+0

这是卓有成效的名称的字符串列表 - 谢谢。我必须改变我的查询var contextations =从c中的context.Conversations where!tags.Except(c.Tags.Select(tag => tag.Name))。Any()select c;现在它工作正常。 有一件事让我困扰 - 性能。还有什么我可以做/改变,以提高查询的性能? – Ando

+0

取决于标签名称集合的大小。我相信表演不会受到影响。无论如何,因为标签名称在内存中,这将生成SQL查询,这将是..某事......标签在(tag1,tag2 ... tagN)。您应该记住,如果标记名称集合太长(超过2000个元素),查询将失败,因为in语句最多支持2000个参数。 – Nas

+0

感谢您的参数 - 我将不得不运行一些测试来观察性能衰减/影响。 – Ando