私は次のクラスを持っています:
public class DbCatalogEntry
{
public int id { get; set; }
private string filename;
public long size { get; set; }
public int duration { get; set; }
public int height { get; set; }
public int width { get; set; }
public string vcodec { get; set; }
public List<CatalogAudioStreamEntry> audiostreams { get; set; }
public string imdbId { get; set; }
public int ownedByUser { get; set; }
public string mxHash { get; set; }
}
public class CatalogAudioStreamEntry
{
public int bitrate { get; set; }
public string codec { get; set; }
public string language { get; set; }
public int channels { get; set; }
public string features { get; set; }
}
これは 1 対多の関係です。DbCatalogEntry
データベースからオブジェクトのリストを取得しようとしていますaudiostreams
が、同じクエリにも入力しています。
次のことを試しましたが、うまくいきません。
var MovieEntryList =
(from vwCat in ctx.sp_GetMovieCatalog(getCurrentUserId())
select new DbCatalogEntry()
{
id = vwCat.id,
size = vwCat.size,
duration = vwCat.duration,
vcodec = vwCat.codec,
Filename = vwCat.filename,
imdbId = vwCat.imdb_id,
mxHash = vwCat.mxhash,
ownedByUser = (int)vwCat.owned,
width = vwCat.width,
height = vwCat.height,
audiostreams =
(from astr in ctx.audiostreamentry
where astr.movie_id == vwCat.id
select new CatalogAudioStreamEntry()
{
bitrate = astr.bitrate,
channels = astr.channels,
codec = astr.codec,
features = astr.features,
language = astr.language
}).ToList()
}).ToList();
検索により、ToList() を変換できないため、linq to entity クエリに入れることができないことが明らかになりました。IEnumerable への変更に関する複数の提案を読みaudiostreams
ましたが、これを機能させることもできませんでした。ほとんどの試行は正常にコンパイルされましたが、実行時にUnable to create constant value of type... で失敗しました
この問題を解決するための正しい方向を教えてもらえますか? 重要なことは、データベースへのラウンドトリップを最小限に抑える必要があるため、それぞれDbCatalogEntry
がリストを満たすためにクライアント側のサブクエリを作成することはできません。
更新 #1:
詳細を提供するには: これは、私のデータベースから EF によって生成されたモデルです。
sp_GetMovieCatalog(getCurrentUserId())
結果をフィルター処理するために使用される 1 つのパラメーターを受け入れる SQL サーバー上のストアド関数です。
私がやりたいことは、から選択してmovieenty
、関連するすべての行をロードすることaudiostreamenty
です。このデータは のインスタンスを作成するために使用する必要があるDbCatalogEntry
ため、結果の型は になりますList<DbCatalogEntry>
。
それはまったく可能ですか?たぶん、より良い/より簡単な解決策がありますか?