Учитывая следующее:
public class Person
{
public int ID { get; set;}
public string Name { get; set;}
public IQueryable<Pet> Pets { get;set; }
}
public class Pet
{
public int id { get; set; }
public int OwnerId { get; set; }
public string Name { get; set; }
}
public class SearchCriteria
{
public string PersonName {get; set; }
public List<string> PetNames {get; set;}
}
Реализация выбора всех лиц с их домашними животными при поиске с помощью IQueryable
public List<Person> GetWithPets(SearchCriteria search)
{
var people = (from p in context.People
where p.Name == search.PersonName
select new Person{
ID = p.ID,
Name = p.Name,
Pets = (from pt in context.Pets
where pt.OwnerId == p.ID
select new Pet {
id = pt.ID,
OwnerId = pt.OwnerId,
Name = pt.Name
}).AsQueryable
}).AsQueryable();
foreach(var str in search.PetNames)
{
people = people.Where(o=>o.Pets.Any(p=>p.Name == str));
}
return people.ToList();
}
Моя проблема в том, что независимо от foreach, который ищет имя, в возвращаемом списке людей домашние животные пусты, даже если есть домашние животные, связанные с этим человеком, где я ошибся?
ИЗМЕНИТЬ:
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public IQueryable<Animal> Pets { get; set; }
}
public class Animal
{
public int id { get; set; }
public int? OwnerId { get; set; }
public string Name { get; set; }
}
public class SearchCriteria
{
public string PersonName { get; set; }
public List<string> PetNames { get; set; }
}
class Program
{
public static List<Person> GetWithPets(SearchCriteria search)
{
using (DatabaseEntities context = new DatabaseEntities())
{
var people = (from p in context.Peoples
where p.Name == search.PersonName
select new Person
{
ID = p.ID,
Name = p.Name,
Pets = (from pt in context.Pets
where pt.OwnerID == p.ID
select new Animal
{
id = pt.ID,
OwnerId = pt.OwnerID,
Name = pt.Name
}).AsQueryable()
}).AsQueryable();
foreach (var str in search.PetNames)
{
people = people.Where(o => o.Pets.Any(p => p.Name == str));
}
return people.ToList();
}
}
Name
равнымsearch.PersonName
и с любым питомцем, чье имя находится вsearch.PetNames
? - person Bazzz   schedule 04.04.2012Person
иPet
сопоставляются с БД или это только вспомогательные классы для получения результата поиска? Что произойдет, если вы удалите циклforeach
?Pets
все ещеnull
? - person Slauma   schedule 04.04.2012List<Pet> Pets
действительно личным? Я не знаю, как вы могли установить частное свойство в выбранной проекции. Кроме того, результатом внутреннегоfrom...
являетсяIQueryable<Pet>
, как вы можете назначить егоList<Pet>
, вы должны получить ошибку компилятора. - person Slauma   schedule 04.04.2012people.Where(o=>o.Pets.Any(p=>p == str));
, посколькуp
имеет типPet
, аstr
- этоstring
! Я думаю, это всего лишь псевдокод - person Flowerking   schedule 04.04.2012from...
возвращаетIQueryable<Pet>
, и вы не можете назначить этоList<Pet>
(как уже было сказано выше). И этот фрагмент — самая важная часть вашего вопроса, он должен быть точно вашим настоящим кодом. - person Slauma   schedule 04.04.2012Pets
действительно не может бытьnull
, если этоIQueryable
. Результатом может быть пустая коллекция, но неnull
. Можете ли вы тщательно проверить, является ли это настоящим кодом, который вы используете? Почему-то после всех правок я все еще не доверяю вашему коду. - person Slauma   schedule 04.04.2012