列出IQueryable对象内部
本文关键字:内部 对象 IQueryable 列出 | 更新日期: 2023-09-27 18:29:54
给定以下条件:
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是什么,在返回的人员列表中,pets都是null,即使有和那个人有关联的宠物,我哪里错了?
编辑:
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();
}
}
如果Person
和Pet
是模型的实体,则Person.Pets
是Pet
实体的导航属性,则您希望拥有完整的Person
实体和所有完整的Pet
实体,并参考您的评论。。。
我的方法应该返回name等于的人的列表搜索人名&他们所有的宠物,但只有那些拥有搜索中有这些名字的宠物。宠物名称
你可以使用这个:
public List<Person> GetWithPets(SearchCriteria search)
{
var people = from p in context.People.Include("Pets")
where p.Name == search.PersonName
&& p.Pets.Any(pt => search.PetNames.Contains(pt.Name))
select p;
return people.ToList();
}
或者您可以尝试类似的东西
foreach(var str in search.PetNames)
{
people.Concat(people.Where(o=>o.Pets.Any(p=>p == str)).Include('Pet'));
}
你可以试试这个吗
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
})
}).Include("Pets").AsQueryable();
将AsQueryable()
添加到Pets
集合:
Pets = (from pt in context.Pets
where pt.OwnerId == p.ID
select new Pet {
id = pt.ID,
OwnerId = pt.OwnerId,
Name = pt.Name
}).AsQuerable()