1

非常に単純な db ダイアグラムがあるとします。

ここに画像の説明を入力

そしてそれのためのビュー:

 create view vTraining
as
select t.Id as TrainingId,t.[Status]  , 
t.[User], t.Title,t.Organisation,t.[Month],t.[Year], 
s.Id as SubjectId, s.Name as SubjectName,
c.Text as Comment
from Training t
join Subject s on s.Training = t.Id
join Comment c on c.Training = t.Id

サンプルデータを使用:

ここに画像の説明を入力

ご覧のとおり、これは 3 つの科目を含む 1 つのトレーニングです。この結果を linq to sql でこの構造にマップしたい:

public class ViewModel
    {
        public string Comment { set; get; }
        public List<Item> Trainings { set; get; }
    }

    public class Item
    {
        public int TrainingId { set; get; }
        public int User { set; get; }
        public int Status { set; get; }
        public string Title { set; get; }
        public string Organisation { set; get; }
        public int? Month { set; get; }
        public int Year { set; get; }
        public List<KeyValuePair<int, string>> Subjects { set; get; }
    }

これは私が作成した私のクエリです:

 var data = (from training in dc.vTrainings
                            group training by new
                           {
                               training.TrainingId,
                               training.Status,
                               training.Month,
                               training.Organisation,
                               training.Title
                           }
                                into g
                                select new ViewModel()
                                {
                                    Comment = g.Select(x =>
                                    x.Comment).First(),
                                    Trainings = g.Select(
                                     x => new Item()
                                     {
                                         Month = x.Month,
                                         Organisation = x.Organisation,
                                         Title = x.Title,
                                         Year = x.Year,
                                         Subjects = g.Select(
                                         z => new KeyValuePair<int, string>(z.SubjectId, z.SubjectName)).ToList()
                                     }).ToList()

                                })//.GroupBy(x => x.Trainings).Select(x => x.Key)
                                    .ToList();

残念ながら、私が得た結果は私が望むものではありません: ここに画像の説明を入力

ViewModel オブジェクトは、問題のないものだけが作成されますが、単一のサブジェクトごとに、新しいアイテムが作成されます (1 つにする必要があります)。サブジェクト リストが正しく作成されます。2 番目のグループを作成しようとしましたが、これが今のところ得られる最良の結果です。このクエリを記述して、3 つのサブジェクトを持つ 1 つの Item オブジェクトを持つ 1 つの ViewModel オブジェクトを取得する方法は?

4

2 に答える 2

1

これを試して:

            var trainings =
                dc.vTrainings
                    .GroupBy(
                        t => new
                        {
                            t.TrainingId,
                            t.Status,
                            t.Month,
                            t.Organisation,
                            t.Title,
                            t.User,
                            t.Year
                        },
                        t =>
                        new
                        {
                            t.SubjectId,
                            t.SubjectName
                        })
                    .ToList()
                    .Select(
                        t =>
                            new Item
                            {
                                TrainingId = t.Key.TrainingId,
                                Status = t.Key.Status,
                                Month = t.Key.Month,
                                Organisation = t.Key.Organisation,
                                Title = t.Key.Title,
                                User = t.Key.User,
                                Year = t.Key.Year,
                                Subjects =
                                    t.Select(s => new KeyValuePair<int,string>(s.SubjectId,s.SubjectName)).ToList()
                            });
于 2012-08-07T07:19:16.547 に答える
1

私は最終的に適切な結果を得ました:

var data = (from g in
                                (from training in dc.vTrainings
                                 where training.Status ==1
                                 group training
                                 by new
                                {
                                    training.TrainingId,
                                    training.Status,
                                    training.Month,
                                    training.Organisation,
                                    training.Title
                                }
                                     into g
                                     select g).AsEnumerable()

                            select new ViewModel()
                            {
                                Comment = g.Select(x =>
                                x.Comment).FirstOrDefault(),
                                Trainings = g.GroupBy(x => x.Status).Select(
                                 x => new Item()
                                 {
                                     Month = g.Key.Month,
                                     Organisation = g.Key.Organisation,
                                     Title = g.Key.Title,
                                     Subjects = (from i in g select new KeyValuePair<int, string>(i.SubjectId, i.SubjectName)).ToList()
                                 }).ToList()
                            }).ToList();

このクエリは 1 つのトレーニングに対してのみ機能しますが、最新のステータスでフィルター処理しているため、私にとってはこれは問題ではありません。それでも、複数のトレーニングに対してそれをどのように記述するかが気になります。

于 2012-08-07T07:42:37.770 に答える