我正在开发一个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
答案 0 :(得分:1)
尼克,你的筹码追踪中有什么?错误消息似乎表明您将从内部异常中获取更多信息,为什么不查看它?
另一种解决方法是在第二个示例中调用.ToList().Distinct
。这会将数据从数据库中拉出来,然后在线路上为你做计数,所以它可能不是你所需要的,但它应该有效。
干杯。
答案 1 :(得分:1)
问题是你这样做:
return View(enteredBy);
您的视图页面似乎不需要这种类型的模型。
如果要在ViewBag中存储用户数,则无需将查询传递给模型:
ViewBag.Count = enteredBy.Count();
return View(); // dont need a strongly typed model
然后在您的视图中,您可以这样显示:
User Count: @ViewBag.Count
如果查看视图(DisplayCount.cshtml),则应检查@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
}
答案 2 :(得分:1)
假设你想为每个不同的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();