Непроинициализированные переменные в 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 = dirs
.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 = dirs
.Trim(), IsDirectory =
true
, CreatedDate =
DateTime
.Now, ParentFolder = path };
db.Files.InsertOnSubmit(f);
}
path = f;
}
db.SubmitChanges(); Вроде все правильно, да? Вот только нифига не работает - первый же поиск ничего не находит и заводит новую запись. Хотя запись с указанным именем и пустым родительским путем гарантированно существует в базе
. Но при этом все сразу начинает чудесно искаться как только вместо использования переменной path я указываю константу null
. Я уже не стал ковыряться еще на тему "а фигли оно так?", а просто переписал код через итератор с предварительным шагом 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 = dirs
.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 = dirs
.Trim(), IsDirectory = true, CreatedDate = DateTime.Now, ParentFolder = path };
db.Files.InsertOnSubmit(f);
}
path = f;
}
db.SubmitChanges(); Весьма, вообщем, нетривиальное уродство. да и времени в дебаге жалко 