我正在开发一个MVC应用程序,该应用程序此时应该返回在SQL表中创建了一个条目的Distinct用户。我在表中有一个名为EnteredBy的列,其中包含多次输入的所有用户(大约10个不同的用户)的名称。我尝试过这个LINQ查询,但它不起作用:
[HandleError]
public ActionResult DisplayCount()
{
var enteredBy = (from user in db.Table
select user.EnteredBy).Distinct();
ViewBag.Count = enteredBy.Count();
return View(enteredBy);
}
我也按照别人的建议尝试过:
[HandleError]
public ActionResult DisplayCount()
{
var enteredBy = (from user in db.Table
select new { user.EnteredBy}).Distinct();
ViewBag.Count = enteredBy.Count();
return View(enteredBy);
}
视图:
@model IEnumerable<Statistic.Models.Table>
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>DisplayCount</title>
</head>
<body>
<div>
Entered by: <br /><br />
@foreach (var m in Model)
{
@m.EnteredBy <br />
}
<br /> Total Count: <br />
@ViewBag.Count
</div>
</body>
</html>
但它产生了相同的结果:
在执行当前web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。
我有什么东西不见了吗?
堆栈跟踪:
[InvalidOperationException: The model item passed into the dictionary is of type 'System.Data.Entity.Infrastructure.DbQuery`1[<>f__AnonymousType4`1[System.String]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[Statistic.Models.DashboardLibAnswer]'.]
System.Web.Mvc.ViewDataDictionary`1.SetModel(Object value) +175
System.Web.Mvc.ViewDataDictionary..ctor(ViewDataDictionary dictionary) +361
System.Web.Mvc.WebViewPage`1.SetViewData(ViewDataDictionary viewData) +49
System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +98
System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +107
System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +291
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
System.Web.Mvc.<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17() +23
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +245
System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +22
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +176
System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +75
System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +99
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +39
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9629296
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
问题是您正在执行以下操作:
return View(enteredBy);
您的视图页面似乎不需要这种类型的模型。
如果您将用户数量存储在ViewBag中,则不需要将查询传递给模型:
ViewBag.Count = enteredBy.Count();
return View(); // dont need a strongly typed model
然后在你的视图中,你可以这样显示:
User Count: @ViewBag.Count
如果查看您的视图(DisplayCount.cs.html),您应该检查@model语句的内容。如果你使用ViewBag,你甚至不需要它。如果你想切换到强类型模型,你可以使用int,因为这就是你现在真正想要的用户数:
@model int
User Count: @Model
编辑
看起来您正在尝试获取用户列表,而不是用户计数。试试这个:
var uniqueUsers = db.Table.Select(t => t.EnteredBy).Distinct().ToList();
return View(uniqueUsers);
您的视图需要一个IEnumerable:
@model IEnumerable<string>
@foreach(var user in Model)
{
Entered By: @user
}
Nick,堆栈跟踪中有什么?错误消息似乎表明您将从内部异常中获得更多信息,为什么不检查一下呢?
另一个解决方法是在第二个示例中调用.ToList().Distinct
。这将从数据库中提取数据,然后在你这边为你计数,所以从性能的角度来看,这可能不是你需要的,但它应该可以工作。
干杯。
假设您想为每个不同的EnteredBy获得一个Table实体。。。
视图的模型是IEnumerable<Statistic.Models.DashboardLibAnswer>
。
你传递了一个奇怪的匿名字符串Queryable。。。
所以你的查询应该是这样的(取决于你想取哪个表),
db.Table.GroupBy (m => m.EnteredBy)
.Select(g => g.First()).ToList();
解决方案2
只需将视图的模型更改为@model IEnumerable<string>
在查询中添加ToList(),并更改视图中的foreach
@foreach (var m in Model)
{
@m<br />
}
一般备注
计数不需要ViewBag:
你可以使用
@Model.Count();