混淆的场景:一个人有零个,一个或多个宠物。
使用Linq to Sql,需要获得给定personID的IQueryable
宠物列表。
这是ERD中受损严重/被剔除/混淆的部分:
代码:
public IQueryable<Pet> GetPersonPets(int personID)
{
var personPets= from p in Person
where p.ID == somePersonID
select p.Pets;
return personPets; //fail
// return (IQueryable<Pet>)personPets //also fail
// return personPets.AsQueryable<Pet>() //also fail
}
举起异常:
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable (System.Data.Linq.EntitySet(Pet))' to 'System.Linq.IQueryable(Pet)'. An explicit conversion exists (are you missing a cast?)
尝试失败:
直接投射不起作用:(IQueryable<MyType>)
调用收集方法AsQueryable
不起作用:.AsQueryable<MyType>()
问题:
如何将LinqToSql查询的结果正确地转换为IQueryable
?
答案 0 :(得分:45)
这对我有用(当然有不同的表,但关系相同):
IQueryable<Pet> personPets = (
from p in db.Person
where p.ID == somePersonID
select p
).Single().Pets.AsQueryable();
虽然我可能会用这种方式写一些变体:
var personPets =
db.Person.Single(t => t.Id == somePersonId).Pets.AsQueryable();
答案 1 :(得分:2)
List<Pet> personPets =
(from p in Persons
where p.ID == somePersonID
select p.Pets).ToList();
尝试这样的事情。
答案 2 :(得分:2)
查看您的查询:
var personPets= from p in Person
where p.ID == somePersonID
select p.Pets;
发生的事情是您正在返回IEntitySet<Pet>
类型的IEnumerable(一个元素)(类型: IEnumerable<IEntitySet<Pet>>
)。
您应该获得 IEnumerable<Pet>
, IQueryable<Pet>
AsQueryable
>方法:
public IQueryable<Pet> GetPersonPets(int personID)
{
var person = Person.Single(p=> p.ID == personID);
return person.Pets.AsQueryable();
}
答案 3 :(得分:1)
我有以下内容,效果很好。我用上面提到的两个表设置了一个简单的数据库,并使用VS生成数据类。
var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
where p.PersonId == 1
select p.Pet;
对我来说,你的Person实际上是 Class 而不是数据库对象(默认情况下由代码生成器命名)。测试上面是否适合你,有时调试器可能只是给你一些奇怪的理由,而这实际上并没有指出真正的问题。
答案 4 :(得分:1)
什么对我有用,
var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
where p.PersonId == 1
select p.Pet;
IQuerable<Pet> pets = (IQuerable<Pet>)personPets;
奇怪的是