難読化されたシナリオ:人のペットはゼロ、1、または複数です。
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
}
_
例外が発生しました:
暗黙的に型 'System.Collections.Generic.IEnumerable(System.Data.Linq.EntitySet(Pet))' を 'System.Linq.IQueryable(Pet)に変換できません'。 明示的な変換が存在します(キャストがありませんか?)
失敗した試行:
直接キャストが機能しませんでした:_(IQueryable<MyType>)
_
コレクションメソッドAsQueryable
の呼び出しが機能しませんでした:.AsQueryable<MyType>()
質問:
LinqToSqlクエリの結果を適切にIQueryable
にキャストするにはどうすればよいですか?
これは私にとってはうまくいきます(もちろん異なるテーブルですが、同じ関係です):
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();
List<Pet> personPets =
(from p in Persons
where p.ID == somePersonID
select p.Pets).ToList();
このようなものを試してください。
クエリを見てください。
_ 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();
}
_
私にとって何がうまくいったか
var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
where p.PersonId == 1
select p.Pet;
IQuerable<Pet> pets = (IQuerable<Pet>)personPets;
奇妙なことに
私は以下を持っています、そしてそれは完全に機能します。上記の2つのテーブルで単純なデータベースをセットアップし、VSでデータクラスを生成します。
var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
where p.PersonId == 1
select p.Pet;
それは私に見えます、あなたの人は実際にはデータベースオブジェクトではなくClassです(これはデフォルトでコードジェネレーターによって名前が付けられています)。最初に上記が機能するかどうかをテストします。デバッガーが、実際の問題を実際に指し示していない奇妙な理由を単に提供する場合があります。