0

我正在开发一个 MVC 应用程序,此时应该返回在 SQL 表中创建条目的不同用户。我在表中有一个名为 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
4

3 回答 3

1

尼克,你的堆栈跟踪中有什么?该错误消息似乎表明您将从内部异常中获得更多信息,为什么不检查一下呢?

另一种解决方法是调用.ToList().Distinct您的第二个示例。这会将数据从数据库中提取出来,然后在您身边为您进行计数,因此从性能的角度来看,这可能不是您所需要的,但它应该可以工作。

干杯。

于 2013-02-04T14:52:33.657 回答
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
}
于 2013-02-04T14:57:48.320 回答
1

假设您想为每个不同的 EnteredBy 获取一个 Table 实体...

您的视图模型是IEnumerable<Statistic.Models.DashboardLibAnswer>.

你传递了一个奇怪的匿名字符串查询......

所以你的查询应该是这样的(取决于你想拿哪个表),

db.Table.GroupBy (m => m.EnteredBy)
                .Select(g => g.First()).ToList();

解决方案 2

...只需将视图的模型更改为@model IEnumerable<string>

将 ToList() 添加到您的查询中,并在您的视图中更改 foreach

@foreach (var m in Model)
    {
        @m<br />
    }

一般说明

count 不需要 ViewBag :

您可以使用

@Model.Count();
于 2013-02-04T15:02:21.520 回答