0

これは以前の質問のフォローアップです。

3つのプロパティを持つViewModelと、Occクラスの1つのリスト(これにも3つのプロパティがあります)を設定したいと思います。

public class RatesViewModel
{
    public string TypeName { get; set; }
    public long TypeID { get; set; }
    public int TypeCount { get; set; }
    public virtual IQueryable<Occ> Occs { get; set; }
}

public class Occ
{
    public string occ { get; set; }
    public decimal ratetocharge { get; set; }
    public int numOfOcc { get; set; }
    public virtual RatesViewModel RatesViewModel { get; set; }
}

LinqPadで次のLinqクエリを実行すると:

var rooms = tblRoom
    .GroupBy(p => p.tblType)
    .Select(g => new
        {
        TypeName = g.Key.type_name,
        TypeID = g.Key.type_id,
        TypeCount = g.Count(),
          Occs = rates.Where(rt => rt.type_id == g.Key.type_id && 
          (
            (rt.type_id == g.Key.type_id)
          ))
          .GroupBy(rt => rt.occ)
          .Select(proj => new 
                       {
                          occ = proj.Key,
                          ratetocharge = proj.Sum(s => s.rate),
                           numOfOcc = proj.Count()
                       })
        });

        rooms.Dump();

...以前と同様に、探しているデータモデルが正しく返されます。

最初のテーブル

...そしてOccsをクリックすると、Occsクラスにドリルダウンします。 2番目のテーブル

LinqPadの完全なビューは次のとおりです。 完全な結果

VisualStudioでの私のクエリは次のとおりです。

    var rooms = dbr.Rooms
                .GroupBy(p => p.RoomTypes).Select(g => new RatesViewModel
                {
                    TypeName = g.Key.type_name,
                    TypeID = g.Key.type_id,
                    TypeCount = g.Count()
                    ,
                  Occs = db.Rates.Where(rt => rt.type_id == g.Key.type_id && 
                       (
                        (rt.type_id == g.Key.type_id)
                       ))
                      .GroupBy(rt => rt.occ)
                      .Select(proj => new Occ
                       {
                          occ = proj.Key,
                          ratetocharge = proj.Sum(s => s.rate),
                           numOfOcc = proj.Count()
                       })
                })
                .ToList();

ただし、これを実行すると、エラーが発生します。

指定されたLINQ式には、さまざまなコンテキストに関連付けられているクエリへの参照が含まれています。

エラーは理解できたと思いますが、クエリを2つの個別のクエリに分割し、それらのクエリ結果を再度結合して元の結果セットを取得する方法がわかりません。

私のモデルクラスは次のとおりです。

public class Rates
{
    public int id { get; set; }
    public long type_id { get; set; }
    public DateTime ratedate { get; set; }
    public decimal rate { get; set; }
    public string occ { get; set; }
    public List<RoomType> Type { get; set; }
}

public class Rental
    {
        [Key]
        public long rental_id { get; set; }
        public long room_id { get; set; }
        public DateTime check_in { get; set; }
        public DateTime check_out { get; set; }
        public virtual Room Room { get; set; }
}

public class Room
{
    [Key]
    public long room_id { get; set; }
    public long type_id { get; set; }
    public virtual RoomType RoomTypes { get; set; }
    public virtual ICollection<Rental> Rentals { get; set; }
}

public class RoomType
{
    [Key]
    public long type_id { get; set; }
    public string type_name { get; set; }
    public IQueryable<Rates> Rates { get; set; }
    public virtual ICollection<Room> Room { get; set; }
}

誰かが私のクエリまたはモデルを確認して、1つのクエリで機能するようにするか、クエリを2つに分割して、結果セットを組み合わせる方法を教えてもらえますか?

ありがとうございました、

マーク

4

2 に答える 2

2

apitest.Models.RoomContext'には'Rates'の定義が含まれていません...

(ハイドの答えに対するあなたのコメント)

2つの異なるコンテキストインスタンスだけでなく、2つの異なるコンテキストクラスもあります。linqpadクエリがデータベース接続に対して直接行われたと思われます。つまり、1つのlinq-to-sql DataContext(オンザフライで作成)を使用していました。

クエリでは、1つのコンテキストクラス(およびそのインスタンス)を使用する必要があります。また、Linqpadで接続して、VisualStudioと同じクエリプロバイダーをテストしていることを確認します。

于 2012-08-19T14:30:30.317 に答える
1

dbr と db は、同じコンテキストの 2 つの異なるインスタンスのようです。ただし、1 つのクエリでは、1 つのコンテキストのみを使用する必要があります。したがって、次のことをお勧めします。

Occs = dbr.Rates.Where(rt => rt.type_id == g.Key.type_id && ....

これで問題が解決しない場合は、コンテキストを初期化する行を引用できますか?

于 2012-08-16T20:48:48.930 に答える