0

こんにちはこれは私の最初の質問ですので、それが本当に基本的なものである場合はお詫びします-私はプログラミングに非常に慣れていません!!! MVCでc#を使用して、entitymodelコンテキストからDateプロパティを持つオブジェクトを選択しようとしています。この日付は、関連するウェイトオブジェクトなどを選択して、「セット」オブジェクトのリストを取得します。

コードは機能し、私が望むことを実行しますが、このコードをより簡潔にする方法に関する一般的なガイダンスが必要です。コードは次のとおりです。

    public ActionResult showDiary(string datein)
    {
        LocalTestEntities1 dblists = new LocalTestEntities1();
        DateTime date = Convert.ToDateTime(datein);
        IEnumerable<ExerciseDiary> diary = from o in dblists.ExerciseDiaries where o.Date == date select o;
        var mydiary = diary.ToList();
        ExerciseDiary thediary = mydiary[0];
        IQueryable<Weight> weights = from o in dblists.Weights where o.DiaryID == thediary.ID select o;
        var selectedWeight = weights.ToList();
        Weight weight = selectedWeight[0];
        IEnumerable<Set> sets = from x in dblists.Sets where x.WeightId == weight.WeightID select x;

        return View(sets);

    }

ここではあまりにも多くのステップを踏んでいるようです。日記にオブジェクトを1つだけ返すことを知っています。IEnumerableに送信せずにdblistsからこのオブジェクトを取得する方法はありますか?

4

4 に答える 4

1

このFirst()メソッドを使用すると、物事がもう少し簡潔になります。

public ActionResult showDiary(string datein)
{
    using (LocalTestEntities1 dblists = new LocalTestEntities1())
    {
        DateTime date = Convert.ToDateTime(datein);

        var thediary = (from o in dblists.ExerciseDiaries 
                        where o.Date == date 
                        select o).First();
        var weight = (from o in dblists.Weights 
                      where o.DiaryID == thediary.ID 
                      select o).First();

        var sets = (from x in dblists.Sets 
                    where x.WeightId == weight.WeightID 
                    select x).ToList();
    }

    return View(sets);
}

また、LINQ to Entitiesデータアクセスをusingブロックにラップして、適切に破棄する必要があります。

于 2012-07-06T22:16:15.410 に答える
0

レコードがない場合は例外がスローされるため、First()の使用には注意してください。

于 2012-07-06T22:20:40.963 に答える
0

物事を行う方法は常にたくさんありますが...First()リストの最初の結果を常に取得しているだけなので、最も簡単な方法は使用することだと思います。

少しすっきりさせるもう1つの方法は、のようにLINQステートメントを複数行に配置することですsets

を使用することもできますvar。これは、コンパイラに型を推測させない人もいれば、好きな人もいます。私はこれをsets以下で行いました。IEnumerableジェネリックスを使用した大規模な宣言がある場合は、コードが少しクリーンアップされると思います。

public ActionResult showDiary(string datein)
{
    LocalTestEntities1 dblists = new LocalTestEntities1();

    DateTime date = Convert.ToDateTime(datein);
    ExerciseDiary thediary  = dblists.ExerciseDiaries.First(o => o.Date == date);
    Weight weight = dblists.Weights.First(o.DiaryID == thediary.ID);
    var sets = from x in dblists.Sets
               where x.WeightId == weight.WeightID
               select x;

    return View(sets);
}

IMOこれは、上記の回答にあるものよりも読みやすいです。

于 2012-07-06T22:14:44.857 に答える
0
    public ActionResult showDiary(string datein)
        {
            using( var dblists = new LocalTestEntities1())
            {
            var date = Convert.ToDateTime(datein);
            var thediary = dblists.ExerciseDiaries.First(o => o.Date == date);

            var weight = dblists.Weights.First(o => o.DiaryID ==thediary.ID);
            var sets = dblists.Sets.Where(x => x.WeightId == weight.WeightID).AsEnumerable();

            return View(sets);
            }
        }

警告:可能であれば、データは常にそこにあるとは限りません。FirstOrDefault代わりに使用して、null値を確認してください。

于 2012-07-12T09:25:47.563 に答える