2012-07-06 126 views
0

嗨,這是我的第一個問題,所以很抱歉,如果它真的很基礎 - 我很新編程! 在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?

回答

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

海事組織這是比你在上面的答案更容易閱讀。

+0

更接近,但沒有雪茄。這裏有幾個問題。沒有參數驗證。應該使用DateTime.TryParse,如果無效則處理。我們不確定是否有外鍵(權重 - > DiaryId,sets-> WeightId)。還應該將對象/ dbcontext包裝在using語句中。這裏有一個更深層的問題,因爲有假設。如果某個特定日期有多個日記,該怎麼辦?如果日記只包含一個重量,該怎麼辦?後一種情況你可以做一個dblists.ExerciseDiaries.Where(d => d.Date == date).Select(d => d.Weight.Select(w => w.Sets))。FirstOrDefault() – Shelakel 2012-07-06 22:59:57

+1

我不同意,你必須作出與OP相同的假設。 – scottheckel 2012-07-06 23:12:48

+0

感謝這很好,也表明我可以使用我的類對象以及var這些查詢@謝拉克爾感謝您的輸入,但我還沒有開始看看驗證等等(這是下一個) - 有所有的您鍵入的外鍵。每個日期只有一個日誌,每個日誌可能有多個權重 – Luthervd 2012-07-06 23:26:36

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在using塊實體的數據訪問,因此它的妥善處理。

+0

試過這個,但是在我可以將它返回到視圖之前,使用塊會處理集合?我錯過了什麼嗎? – Luthervd 2012-07-06 23:38:27

+0

您需要對錶達式執行'ToList()'以實際運行查詢。我更新了代碼示例以解決此問題。 – 2012-07-07 13:54:57

0

請小心使用First(),因爲如果沒有記錄,它將引發異常。

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並檢查空值。