私は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);
}
:
スタイルのヒントありがとうございます。私はそのような私のコードを短縮することができるか分からなかった!私はちょうど「xe」の「e」がどこから来るのか疑問に思いました。 – Sicypher
'new {e、user}'からです。 –
'joined'変数がnullに戻ります。変数を設定するために必要なことはありますか? – Sicypher