web-dev-qa-db-ja.com

IEnumerable <T>型をIQueryable <T>に暗黙的に変換することはできません

難読化されたシナリオ:人のペットはゼロ、1、または複数です。

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
    }
_

例外が発生しました:

暗黙的に型
 'System.Collections.Generic.IEnumerable(System.Data.Linq.EntitySet(Pet))' 
を 'System.Linq.IQueryable(Pet)に変換できません'。 
明示的な変換が存在します(キャストがありませんか?)

失敗した試行

直接キャストが機能しませんでした:_(IQueryable<MyType>)_

コレクションメソッドAsQueryableの呼び出しが機能しませんでした:.AsQueryable<MyType>()

質問

LinqToSqlクエリの結果を適切にIQueryableにキャストするにはどうすればよいですか?

20
p.campbell

これは私にとってはうまくいきます(もちろん異なるテーブルですが、同じ関係です):

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();    
45
Blorgbeard
List<Pet> personPets = 
   (from p in Persons
   where p.ID == somePersonID
   select p.Pets).ToList();

このようなものを試してください。

2
Andrew Siemer

クエリを見てください。

_    var personPets= from p in Person
    where p.ID == somePersonID
    select p.Pets;
_

起こっているのは、_IEntitySet<Pet>_タイプ(タイプ:_IEnumerable<IEntitySet<Pet>>_)の(1つの要素の)IEnumerableを返すことです。

_IEnumerable<Pet>_を取得する必要があり、AsQueryableメソッドによって_IQueryable<Pet>_に変換されます:

_public IQueryable<Pet> GetPersonPets(int personID)
{
    var person = Person.Single(p=> p.ID == personID);

    return person.Pets.AsQueryable();
}
_
2
CMS

私にとって何がうまくいったか

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

奇妙なことに

1
Hellola

私は以下を持っています、そしてそれは完全に機能します。上記の2つのテーブルで単純なデータベースをセットアップし、VSでデータクラスを生成します。

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

それは私に見えます、あなたの人は実際にはデータベースオブジェクトではなくClassです(これはデフォルトでコードジェネレーターによって名前が付けられています)。最初に上記が機能するかどうかをテストします。デバッガーが、実際の問題を実際に指し示していない奇妙な理由を単に提供する場合があります。

1
xandy