1

私は次のクラスを持っています:

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>

それはまったく可能ですか?たぶん、より良い/より簡単な解決策がありますか?

4

1 に答える 1

1

複数のクエリに同じコンテキストを使用しようとしているため、問題があると思います

この方法で試すことができます:

    var MovieEntryList = 
    (from vwCat in ctx.sp_MovieCatalog
    where vwCat.owned = currentUserId
    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 = vwCat.audiostreamentry.Select(astr=>
               new CatalogAudioStreamEntry()
                  {
                      bitrate = astr.bitrate,
                      channels = astr.channels,
                      codec = astr.codec,
                      features = astr.features,
                      language = astr.language
                  }).ToList()
      }).ToList();

またはこの方法:

    var MovieEntryList = ctx.audiostreamentry.where(p=>p.movieCatolog.ownedByUser - currentUserId)
    //.ToList() //if you call ToList() here futher will be LINQ to Object, and you want have most of problems
    .GroupBy(p=>new {Id = p.movieCatolog.id, Owner = p.movieCatolog.p.movieCatolog.id})
    .Select(p=> new DbCatalogEntry{
    id = p.Key.Id,
    ownedByUser = p.Key.Owner,
    audiostrams = p.Select(x=>new CatalogAudioStreamEntry
    {
                      bitrate = astr.bitrate,
                      channels = astr.channels,
                      codec = astr.codec,
                      features = astr.features,
                      language = astr.language
                  })

    })
于 2013-06-08T15:47:24.253 に答える