编程如何使这段代码更简洁的新功能

时间:2012-07-06 22:07:21

标签: c# asp.net-mvc entity-framework

嗨,这是我的第一个问题,如果它真的很基本,那么道歉 - 我对编程很新! 在MVC中使用c#我试图从entitymodel上下文中选择具有Date属性的对象。然后,此日期选择相关的Weight对象,依此类推以获取“Set”对象列表。

代码可以正常工作并完成我想要的但是想要一些关于如何使这些代码更简洁的一般指导。这是代码:

    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);

    }

我似乎在这里采取了太多步骤。我知道我只是将一个物体归还日记。有没有办法从dblists获取此对象而不发送到IEnumerable?

4 个答案:

答案 0 :(得分: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);
}

您还应该在using块中包装LINQ to Entities数据访问权限,以便妥善处理。

答案 1 :(得分:0)

总有很多方法可以做,但是......我认为最简单的方法是使用First()因为你总是只是抓住列表中的第一个结果。

使其变得更清晰的另一种方法是将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这比你上面的答案更容易阅读。

答案 2 :(得分:0)

小心使用First(),因为如果没有记录,它将抛出异常。

答案 3 :(得分: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并检查空值。