2013-02-04 41 views
0

我正在处理一个MVC应用程序,此时应返回在SQL表中创建条目的区分用户。我在表格中有一个名为EnteredBy的列,其中包含所有用户(约10个不同用户)的姓名,他们已多次输入。我曾尝试LINQ查询,但它不工作:无法获得独特的方法来处理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> 

但它产生相同结果:

产生未处理的异常d在执行当前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

你能后的堆栈跟踪? – Dismissile

+0

已添加堆栈跟踪 – Nick

+0

添加了答案 - 看起来您的视图有错误的模型类型。 – Dismissile

回答

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 
} 
+0

我试过这个,但现在它在@foreach(模型中的var m)抛出“System.NullReferenceException” – Nick

+0

已更新,不太清楚你在问什么,但我认为这是你想要的。 – Dismissile

+0

Awesome Dismissile,2nd编辑工作。你能否解释一下在这里有什么不同的做法。再次感谢您解决这个问题! – Nick

1

尼克,什么是你的堆栈跟踪?错误消息似乎表明你会从内部异常中获得更多信息,为什么不检查它?

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

干杯。

1

假设你想获得一个表实体对每个不同的EnteredBy ...

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

您通过匿名串的一个奇怪的可查询......

所以您的查询应该是类似的东西(这取决于你的表要带),

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

解决方案2

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

将ToList()添加到您的q uery,并更改的foreach在您看来

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

一般此言

不需要一个ViewBag用于计数:

可以使用

@Model.Count(); 
+0

谢谢拉斐尔,我已经尝试了这两种解决方案,但是我得到的结果与我在Dismissile的答案中发布的结果相同。 – Nick