0

この時点で、SQL テーブルにエントリを作成した個別のユーザーを返す必要がある MVC アプリケーションに取り組んでいます。テーブルに 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

問題はあなたがこれをしているということです:

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 ごとに 1 つの 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 />
    }

総論

count に ViewBag は必要ありません:

あなたが使用することができます

@Model.Count();
于 2013-02-04T15:02:21.520 に答える
1

ニック、あなたのスタック トレースには何がありますか? エラー メッセージは、内部例外からより多くの情報を取得できることを示しているようです。チェックしてみてください。

.ToList().Distinct別の回避策は、2 番目の例を呼び出すことです。これにより、データベースからデータが引き出され、ワイヤの側でカウントが行われるため、パフォーマンスの観点からは必要ないかもしれませんが、機能するはずです。

乾杯。

于 2013-02-04T14:52:33.657 に答える