.net 搜索多个标记时按标记选择项目
我在这里有点挣扎,所以我想为什么不问问: 我系统中的每个实体都有一个标签列表(字符串列表),我希望能够一次搜索多个标签 我有一个可以共事的人。每个实体都有一个名为Tags的IList,我的输入参数是一个IList 我可以简单地遍历所有标记并执行IQueryable.Where(p=>p.tags.Contains(currentTag)),但如果使用许多标记作为输入,则无法很好地扩展,而且我感觉这可以在LinQ内部完成 希望有人有想法 编辑:澄清问题: 我搜索一种方法,仅从IQueryable中选择包含所有提供的参数标记(IList)的项.net 搜索多个标记时按标记选择项目,.net,linq,.net,Linq,我在这里有点挣扎,所以我想为什么不问问: 我系统中的每个实体都有一个标签列表(字符串列表),我希望能够一次搜索多个标签 我有一个可以共事的人。每个实体都有一个名为Tags的IList,我的输入参数是一个IList 我可以简单地遍历所有标记并执行IQueryable.Where(p=>p.tags.Contains(currentTag)),但如果使用许多标记作为输入,则无法很好地扩展,而且我感觉这可以在LinQ内部完成 希望有人有想法 编辑:澄清问题: 我搜索一种方法,仅从IQueryable中
你好,丹尼尔/提格莱恩我不确定我是否真的理解你的要求,但也许下面的内容会有用
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多个标记,则应寻求其他解决方案
- 我在午夜后没有工具的情况下写了这篇文章。它可能并不完美