22

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

使用 Linq to Sql,需要获取IQueryable给定 personID 的宠物列表。这是 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
    }

引发异常:

无法隐式转换类型
'System.Collections.Generic.IEnumerable (System.Data.Linq.EntitySet(Pet))'
到“System.Linq.IQueryable(Pet)”。
存在显式转换(您是否缺少演员表?)

失败的尝试

直接铸造不起作用: (IQueryable<MyType>)

调用收集方法AsQueryable不起作用: .AsQueryable<MyType>()

问题

如何正确地将 LinqToSql 查询的结果转换为IQueryable

4

5 回答 5

47

这对我有用(当然有不同的表,但关系相同):

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();    
于 2009-07-04T01:50:42.643 回答
2
List<Pet> personPets = 
   (from p in Persons
   where p.ID == somePersonID
   select p.Pets).ToList();

尝试这样的事情。

于 2009-07-04T01:57:43.673 回答
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();
}
于 2009-07-04T02:13:11.100 回答
1

我有以下内容,并且效果很好。我用上面提到的两个表设置了一个简单的数据库,并用 VS 生成了数据类。

var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
                 where p.PersonId == 1
                 select p.Pet;

在我看来,您的 Person 实际上是Class而不是数据库对象(默认情况下由代码生成器命名)。首先测试上面的方法是否适合你,有时调试器可能只是给你一些奇怪的理由,这实际上并没有指向真正的问题。

于 2009-07-04T01:56:57.683 回答
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;

奇怪的是

于 2010-08-10T07:28:05.810 回答