Я пытаюсь получить запрос, который будет искать несколько тегов. Теги основаны на db, и я связал их с сущностью с помощью таблицы соединений. Если я ищу с 1 тегом, я получаю правильные результаты, но если я ищу с 2 тегами, я получаю только сущности, соответствующие второму тегу.LINQ: multiple В каких случаях используется только последний?
Вот C# код, который строит IQueryable:
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, который, если я подключить его в окно запроса и задать значения параметров, включает в себя как где положения и возвращает правильный список сущностей. (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)
}
Это своего рода растерзание, любые советы приветствуются. Благодарю.
Что действительно заставляет вас задуматься, почему вы делаете некоторые вещи: 'var awTable = db.Artworks.Where (aw => true); // default get all' ... wat – JustLoren
Я попробовал уйти из инструкции if для ясности: var awTable = db.Artworks.Where (aw => true); if (! IsAuthenticated) { awTable = awTable.Where (aw => (bool) aw.IsArtworkVisible); } –