Добро пожаловать в Записки дилетанта Войти|Регистрация | Помощь
Непроинициализированные переменные в LINQ запросе

Нарвался на весьма и весьма неадекватное поведение LINQ кода - пришлось в отладке понапрягаться парочку часиков. Вообщем изначально: имеем задачу рекурсивного поиска (и в случае отсутствия - добавления) элемента, Заданного путем в БД. Грубо говоря - файл менеджер в базе. Не мудрствуя лукаво пишу примерно такой кд:

string [] dirs = txtPath.text .Split( '/' );
File  path = null;
foreach ( string p in dirs)
{
File f = db.Files.FirstOrDefault( x => x.Name == p && x.ParentFilder == path);
if (f == null )
{
f =
new File { FileID = Guid .NewGuid(), Name = dirsIdea.Trim(), IsDirectory = true , CreatedDate = DateTime .Now, ParentFolder = path };
db.Files.InsertOnSubmit(f);
}
path = f;
}
db.SubmitChanges();

string [] dirs = txtPath.text .Split( '/' );
File  path = null;
foreach ( string p in dirs)
{
File f = db.Files.FirstOrDefault( x => x.Name == p && x.ParentFilder == path);
if (f == null )
{
f =
new File { FileID = Guid .NewGuid(), Name = dirsIdea.Trim(), IsDirectory = true , CreatedDate = DateTime .Now, ParentFolder = path };
db.Files.InsertOnSubmit(f);
}
path = f;
}
db.SubmitChanges();

Вроде все правильно, да? Вот только нифига не работает - первый же поиск ничего не находит и заводит новую запись. Хотя запись с указанным именем и пустым родительским путем гарантированно существует в базеAngryНо при этом все сразу начинает чудесно искаться как только вместо использования переменной path  я указываю константу null Indifferent. Я уже не стал ковыряться еще на тему "а фигли оно так?", а просто переписал код через итератор с предварительным шагом null параметра:

string[] dirs = txtPath.text.Split('/');
File
path = db.Files.FirstOrDefault(x => x.Name == dirs[0] && x.ParentFolder == null);
if (path == null)
{
path =
new File { FileID = Guid.NewGuid(), Name = dirs[0], IsDirectory = true, CreatedDate = DateTime.Now, ParentFolder = null };
db.Files.InsertOnSubmit(path);
}
for(int i = 1; i < dirs.Length; i++)
{
f = new File { FileID = Guid.NewGuid(), Name = dirsIdea.Trim(), IsDirectory = true, CreatedDate = DateTime.Now, ParentFolder = path };
db.Files.InsertOnSubmit(f);
}
path = f;
}
db.SubmitChanges();

string[] dirs = txtPath.text.Split('/');
File
path = db.Files.FirstOrDefault(x => x.Name == dirs[0] && x.ParentFolder == null);
if (path == null)
{
path =
new File { FileID = Guid.NewGuid(), Name = dirs[0], IsDirectory = true, CreatedDate = DateTime.Now, ParentFolder = null };
db.Files.InsertOnSubmit(path);
}
for(int i = 1; i < dirs.Length; i++)
{
f = new File { FileID = Guid.NewGuid(), Name = dirsIdea.Trim(), IsDirectory = true, CreatedDate = DateTime.Now, ParentFolder = path };
db.Files.InsertOnSubmit(f);
}
path = f;
}
db.SubmitChanges();

Весьма, вообщем, нетривиальное уродство. да и времени в дебаге жалко Wink

Posted: Sunday, January 06, 2008 12:48 AM от Дмитрий Руденко
Метки (ключевые слова): ,

Комментарии:

ЮАР сказал:

Да, очень полезная информация, как раз то что я искал.

# January 26, 2008 9:29 AM
Новые Комментарии отключены.