.net 搜索多个标记时按标记选择项目

.net 搜索多个标记时按标记选择项目,.net,linq,.net,Linq,我在这里有点挣扎,所以我想为什么不问问: 我系统中的每个实体都有一个标签列表(字符串列表),我希望能够一次搜索多个标签 我有一个可以共事的人。每个实体都有一个名为Tags的IList,我的输入参数是一个IList 我可以简单地遍历所有标记并执行IQueryable.Where(p=>p.tags.Contains(currentTag)),但如果使用许多标记作为输入,则无法很好地扩展,而且我感觉这可以在LinQ内部完成 希望有人有想法 编辑:澄清问题: 我搜索一种方法,仅从IQueryable中

我在这里有点挣扎,所以我想为什么不问问:

我系统中的每个实体都有一个标签列表(字符串列表),我希望能够一次搜索多个标签

我有一个可以共事的人。每个实体都有一个名为Tags的IList,我的输入参数是一个IList

我可以简单地遍历所有标记并执行IQueryable.Where(p=>p.tags.Contains(currentTag)),但如果使用许多标记作为输入,则无法很好地扩展,而且我感觉这可以在LinQ内部完成

希望有人有想法

编辑:澄清问题: 我搜索一种方法,仅从IQueryable中选择包含所有提供的参数标记(IList)的项


你好,丹尼尔/提格莱恩

我不确定我是否真的理解你的要求,但也许下面的内容会有用

List<string> searchTags = ...

var query = db.MyEntity
              .Where( e => e.Tags.Intersect( searchTags ).Count() > 0 );
List searchTags=。。。
var query=db.MyEntity
.Where(e=>e.Tags.Intersect(searchTags.Count()>0);
这将为您提供一组实体,其中标记列表至少包含
searchTags

中的一个项目,这是一些适用于您的sql:

SELECT entityID
FROM tags
WHERE tagID in (...) --taglist
GROUP BY entityID
HAVING COUNT(DISTINCT tagID) = ... --tagcount
现在的诀窍是让Linq生成它……下面是一些LinqToSql代码:

public List<int> GetEntityIds(List<int> tagIds)
{
  int tagCount = tagIds.Count;

  CustomDataContext myDC = new CustomDataContext();

  List<int> entityIds = myDC.Tags
    .Where(t => tagIds.Contains(t.TagId))
    .GroupBy(t => t.entityId)
    .Where(g => g.Select(t => t.TagId).Distinct().Count() == tagCount)
    .Select(g => g.Key)

  return entityIds;
}
public List getEntityId(List tagId)
{
int tagCount=tagIds.Count;
CustomDataContext myDC=新建CustomDataContext();
列表EntityId=myDC.Tags
.Where(t=>TagId.Contains(t.TagId))
.GroupBy(t=>t.entityId)
.Where(g=>g.Select(t=>t.TagId).Distinct().Count()==tagCount)
.选择(g=>g.Key)
返回实体ID;
}
以下是一些注意事项:

  • List(T).Contains由LinqToSql翻译,但LinqToEntities不会翻译它。您将得到一个运行时异常
  • IList.Contains…没有人翻译它。请改用List(T)
  • sql server有一个有效的参数计数限制。大约有2000个参数(高于但低于2500个)。如果需要使用2000多个标记,则应寻求其他解决方案
  • 我在午夜后没有工具的情况下写了这篇文章。它可能并不完美

我只是在回答中添加了一个澄清,并将尝试..我考虑了CCT,但没有跟进。