Linq to sql 使用T-SQL和LINQtoSQL的标记过滤查询?

Linq to sql 使用T-SQL和LINQtoSQL的标记过滤查询?,linq-to-sql,tags,Linq To Sql,Tags,我试图弄清楚如何允许用户在文本框中输入一系列标记(用空格分隔的关键字),以过滤结果网格 以下是表格: 数据包 *PacketID 名字 包装标签 *PacketTagID PacketID 塔吉德 标签 *TagID 名字 以下是不带WHERE参数的基本查询: SELECT Packets.Name, Tags.Name AS Tag, PacketTags.PacketTagID FROM Packets INNER JOIN

我试图弄清楚如何允许用户在文本框中输入一系列标记(用空格分隔的关键字),以过滤结果网格

以下是表格:


数据包
*PacketID
名字


包装标签
*PacketTagID
PacketID
塔吉德


标签
*TagID
名字


以下是不带WHERE参数的基本查询:

SELECT     
       Packets.Name, Tags.Name AS Tag, PacketTags.PacketTagID
FROM         
       Packets 
INNER JOIN
       PacketTags ON Packets.PacketID = PacketTags.PacketID 
INNER JOIN
       Tags ON PacketTags.TagID = Tags.TagID
我需要过滤掉所有没有与任何单词匹配的标签的数据包,但也只包括在文本字符串中输入标签的数据包(在文本框中输入标签时,空格分隔标签)


我先从基础开始,在t-SQL中解决这个问题,但最终我需要能够在Linq to SQL中实现这一点,假设内存中有一个标记列表:

var query = from p in DataContext.Packets 
            where p.Tags.Intersect(listOfMustHaveTags).Count() == listOfMustHaveTags.Count()
            select p;

我在这里使用intersect检查必备标记集是否完全包含。也许还有一个更简单的解决方案。

创建一个函数,该函数接受以空格分隔的标记列表并返回一个表。将上面的查询内部连接到该函数的结果

有几个函数可以实现这一点。这里有两个:


该函数也可以通过linq调用sql。

Oh和顺便说一句。在任何人怀疑之前:Intersect由L2S linq提供程序支持。当我使用此Intersect时,如您所建议的:无法将“System.Collections.Generic.List”类型的对象强制转换为“System.Collections.Generic.IEnumerable”1[MB.PacketTag]'。您能发布完整的代码吗?这是一个简单的错误。很抱歉延迟-我将在本周末更新完整的代码。