无法获得与LINQ查询相关的独特方法

时间:2013-02-04 14:40:04

标签: asp.net-mvc linq

我正在开发一个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

3 个答案:

答案 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();