我正在尝试进行一个将搜索多个标签的查询。标签是基于数据库的,我已经将它们与带有联结表的实体相关联。如果我用 1 个标签搜索,我会得到正确的结果,但如果我用 2 个标签搜索,我只会得到与第二个标签匹配的实体。
这是构建 IQueryable 的 C# 代码:
var awTable = db.Artworks.Where( aw => true ); //default get all
awTable = awTable.Where( aw => (bool)aw.IsArtworkVisible );
foreach ( SearchTag tagToMatch in tagList )
{
awTable = awTable.Where( aw => aw.ArtworkName.Contains( tagToMatch.SearchTagText )
|| db.SearchTag_x_Artworks.Where( stxa => stxa.SearchTagID == tagToMatch.SearchTagID )
.Select( stxa => stxa.ArtworkID ).Contains( aw.ArtworkID ) );
}
这是生成的 SQL,如果我将其插入查询窗口并设置参数值,它将包含 where 子句并返回正确的实体列表。(WTF!?!?)
{SELECT [t0].[ArtworkID], [t0].[ArtworkName], ... [t0].[MediumID]
FROM [dbo].[Artworks] AS [t0]
WHERE ((EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[SearchTag_x_Artwork] AS [t1]
WHERE ([t1].[ArtworkID] = [t0].[ArtworkID]) AND ([t1].[SearchTagID] = @p0)
)) OR ([t0].[ArtworkName] LIKE @p1)) AND ((EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[SearchTag_x_Artwork] AS [t2]
WHERE ([t2].[ArtworkID] = [t0].[ArtworkID]) AND ([t2].[SearchTagID] = @p2)
)) OR ([t0].[ArtworkName] LIKE @p3)) AND (([t0].[IsArtworkVisible]) = 1)
}
这有点令人困惑,任何建议都值得赞赏。谢谢。