2016-05-13 6 views
0

私はASP.NET MVC 4を使用していますが、私はいくつかの行(経費)を見ることができ、各行の横にチェックボックス入力があります。モデルには、 "Submitted"というブール値のプロパティとDateSubmittedというDateTimeプロパティがあります。Linqクエリ内で列挙を使用してデータベース内の複数の行を更新する方法

私はSubmitExpenses()というメソッドを持っていますが、私は、チェックされた行だけを更新したいだけです。

更新される列は、DateSubmittedとSubmittedです。ここで

は私のモデルである:ここでは

public class Expense 
{ 
    public Expense() { } 

    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ExpenseId { get; set; } 

    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")] 
    [Display(Name = "Date Submitted")] 
    public DateTime? DateSubmitted { get; set; } 

    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")] 
    [Display(Name = "Expense Date")] 
    public DateTime? ExpenseDate { get; set; } 

    [Display(Name = "Submitted?")] 
    public bool Submitted { get; set; } 

    [Required] 
    [Display(Name = "Name")] 
    public int UserId { get; set; } 
    [ForeignKey("UserId")] 
    public virtual UserProfile UserProfile { get; set; } 

} 

がSubmitExpensesある()メソッド:

public ActionResult SubmitExpenses(List<Expense> expenses, DateTime? expenseDate = null, DateTime? expenseDate2 = null, int? userId = 0) 
{ 
    expenseDate = (DateTime)Session["FirstDate"]; 
    expenseDate2 = (DateTime)Session["SecondDate"]; 

    if (expenseDate == null || expenseDate2 == null) 
    { 
     expenseDate = DateTime.Now.AddMonths(-1); 
     expenseDate2 = DateTime.Today; 
    } 

    string currentUserId = User.Identity.Name; 

    var query = from e in db.Expenses 
       join user in db.UserProfiles on e.UserId equals user.UserId 
       where user.UserName == currentUserId && (e.ExpenseDate >= expenseDate && e.ExpenseDate <= expenseDate2) && e.DateSubmitted == null 
       orderby e.ExpenseDate descending 
       select e; 

    if (User.IsInRole("admin") && userId != 0) 
    { 

     query = from e in db.Expenses 
       join user in db.UserProfiles on e.UserId equals user.UserId 
       where user.UserId == userId && e.ExpenseDate >= expenseDate && e.ExpenseDate <= expenseDate2 && e.DateSubmitted == null 
       orderby e.ExpenseDate descending 
       select e; 
    } 
    else if (User.IsInRole("admin")) 
    { 
     query = from e in db.Expenses 
       join user in db.UserProfiles on e.UserId equals user.UserId 
       where e.ExpenseDate >= expenseDate && e.ExpenseDate <= expenseDate2 && e.DateSubmitted == null 
       orderby e.ExpenseDate descending 
       select e; 
    } 


    foreach (Expense exp in query) 
    { 
     exp.DateSubmitted = DateTime.Today; 
    } 

    try 
    { 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); 
     return RedirectToAction("Submit"); 
    } 

} 

ここでは、ビューです:

<table> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.DateSubmitted) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.ExpenseDate) 
     </th> 

     @if (User.IsInRole("admin")) 
     { 
      <th> 
       @Html.DisplayNameFor(model => model.UserProfile.UserName) 
      </th> 
     } 
     <th></th> 
    </tr> 
    <tr> 
     <td> 
      <b>Select All:</b> 
      <br /> 
      <input type="checkbox" name="expense" value="Expense" id="selectAllCheckboxes" class="expenseCheck"> 
     </td> 
    </tr> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td class="submitCheck"> 
       @Html.DisplayFor(modelItem => item.Submitted) 
      </td> 

      <td> 
       @Html.DisplayFor(modelItem => item.DateSubmitted) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.ExpenseDate) 
      </td> 

      @if (User.IsInRole("admin")) 
      { 
       <td> 
        @Html.DisplayFor(modelItem => item.UserProfile.UserName) 
       </td> 
      } 
     </tr> 
    } 

</table> 

@Html.ActionLink("Submit Expenses", "SubmitExpenses") 

@section scripts { 
<script type="text/javascript"> 


    $("#selectAllCheckboxes").click(function() { 
     $('.submitCheck input:checkbox').not(this).prop('checked', this.checked); 
    }); 

    $('.submitCheck input:checkbox').prop('disabled', false); 


</script> 

} 

私はすべての費用を提出する方法を知っています指定された日付範囲(またはビューに表示されているすべての経費)に含まれていますが、どのように各rを更新するかはわかりませんこれはチェックされた行だけです。

ありがとうございます。質問の今

var query = from e in db.Expenses 
      join user in db.UserProfiles on e.UserId equals user.UserId 
      where e.ExpenseDate >= expenseDate && e.ExpenseDate <= expenseDate2 && e.DateSubmitted == null 
      orderby e.ExpenseDate descending 
      select new { e, user }; 

if (User.IsInRole("admin") && userId != 0) 
{ 
    query = query.Where(x => x.user.UserId == userId); 
} 
else if (!User.IsInRole("admin")) 
{ 
    query = query.Where(x => x.user.UserName == currentUserId); 
} 

答えて

1

まず、余談として、あなたの代わりにあなたのクエリごとに繰り返すのクエリ組成を使用することができます私が正しくあなたを理解していれば、あなたがデータベースから費用を除外したいですビューにはSubmittedとマークされています。これらのフィルタリングされた経費は更新されるべきです。

var joined = from dbExpense in query.Select(x => x.e).AsEnumerable() 
      join localExpense in expenses on dbExpense.ExpenseId equals localExpense.ExpenseId 
      where localExpense.Submitted 
      select dbExpense; 

foreach (Expense exp in joined) 
{ 
    exp.DateSubmitted = DateTime.Today; 
} 

データベースクエリにAsEnumerableを使用することにより、あなたがオブジェクトにLINQのようなローカルシーケンス(expenses)でそれに参加することができます。それを行うための方法は、ビューからのもので、データベースの費用を接合することです。

+0

スタイルのヒントありがとうございます。私はそのような私のコードを短縮することができるか分からなかった!私はちょうど「xe」の「e」がどこから来るのか疑問に思いました。 – Sicypher

+1

'new {e、user}'からです。 –

+0

'joined'変数がnullに戻ります。変数を設定するために必要なことはありますか? – Sicypher

関連する問題