У меня есть следующий код:LinqToSql странное поведение
var tagToPosts = (from t2p in dataContext.TagToPosts
join t in dataContext.Tags on t2p.TagId equals t.Id
select new { t2p.Id, t.Name });
//IQueryable tag2postsToDelete;
foreach (Tag tag in tags)
{
Debug.WriteLine(tag);
tagToPosts = tagToPosts.Where(t => t.Name != tag.Name);
}
IQueryable tagToPostsToDelete = (from t2p in dataContext.TagToPosts
join del in tagToPosts on t2p.Id equals del.Id
select t2p);
dataContext.TagToPosts.DeleteAllOnSubmit(tagToPostsToDelete);
где tags
является List<Tag>
- список тегов, созданных конструктором, поэтому у них нет идентификатора. Я запускаю код, вставляя brakepoint в очередь с Debug и дожидаясь нескольких циклов. Затем я поместил tagToPosts.ToList() в окно «Часы» для выполнения запроса. В SQL Profiler можно увидеть следующий запрос:
exec sp_executesql N'SELECT [t0].[Id], [t1].[Name]
FROM [dbo].[tblTagToPost] AS [t0]
INNER JOIN [dbo].[tblTags] AS [t1] ON [t0].[TagId] = [t1].[Id]
WHERE ([t1].[Name] @p0) AND ([t1].[Name] @p1) AND ([t1].[Name] @p2)',N'@p0 nvarchar(4),@p1 nvarchar(4),@p2 nvarchar(4)',@p0=N'tag3',@p1=N'tag3',@p2=N'tag3'
Мы можем видеть каждый параметр параметра имеют значение последнего tag.Name
в цикле. Есть ли у вас какие-либо идеи о том, как получить arout this и получить цикл, чтобы добавить Where
с новым условием каждый tyme? Я вижу, что IQueryable сохраняет только указатель на переменную перед выполнением.