无法将IEnumerable <t>类型隐式转换为IQueryable <t> </t> </t>

时间:2009-07-04 01:41:34

标签: linq linq-to-sql collections iqueryable

混淆的场景:一个人有零个,一个或多个宠物。

使用Linq to Sql,需要获得给定personID的IQueryable宠物列表。 这是ERD中受损严重/被剔除/混淆的部分:

alt text

代码:

 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

5 个答案:

答案 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;

奇怪的是