10

エラー

Unable to cast the type 'System.Nullable`1' to type 'System.Object'.
 LINQ to Entities only supports casting Entity Data Model primitive types.

これは私が得ているエラーです。

コントローラ-

 public ActionResult FixturesAll()
 {
     teamMgr = new TeamManager();
     fixtureMgr = new FixtureManager();

     var team = teamMgr.GetTeams();
     var viewModel = new TeamIndexViewModel()
     {
          Teams = team.ToList(),
          NumberOfTeams = team.Count()
     };

     var fixtures = from fixtures in Oritia_entities.Fixtures
                    where fixtures.SeasonId == seasionID
                    select new FixtureModel
                    {

                        Team1 = "",
                        Team2 = "",
                        Winners = (fixtures.TeamWon+""),
                        FirstBattingTeam = (fixtures.FirstBattingTeam+""),
                        SecondBattingTeam = (fixtures.SecondBattingTeam+""),
                        Team1Score = fixtures.Team1Score + "",
                        Team1Wickets = fixtures.Team1Wickets + "",
                        Team2Score = fixtures.Team2Score + "",
                        Team2Wickets = fixtures.Team2Wickets + ""
                    };

      ViewData["Fixtures"] = fixtures;
      return View(viewModel);
 }

部分図

<%@ Control Language="C#" Inherits=
"System.Web.Mvc.ViewUserControl<IEnumerable<DataAccess.FixtureModel>>" %>
    <table>
    <% foreach (var item in ViewData["Fixtures"]
 as IEnumerable<DataAccess.FixtureModel>) // Here I am getting the error
       { %>
          <tr>                 
            <td>
                <%: item.Team1 %>
            </td>
            <td>
                <%: item.Team2 %>
            </td>
          </tr>
   </table>

意見

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
 Inherits="System.Web.Mvc.ViewPage<FunBox.ViewModels.TeamIndexViewModel>" %>
<ul>
    <% foreach (string team in Model.Teams)
       { %>
           <li><a href="<%: team.ToString() %>/">
           <%: team.ToString()  %></a> </li>
    <% } %>
</ul>

<div>
        <% Html.RenderPartial("FixturesAll",ViewData["Fixtures"]); %>
    </div>

複雑なクラス

 public class TeamIndexViewModel
 {
     public int NumberOfTeams { get; set; }
     public List<String> Teams { get; set; }
 }

 public class FixtureModel
 {
     public string Team1 { get; set; }
     public string Team2 { get; set; }
     public string Winners { get; set; }
     public string Team1Score { get; set; }
     public string Team1Wickets { get; set; }
     public string Team2Score { get; set; }
     public string Team2Wickets { get; set; }
     public string FirstBattingTeam { get; set; }
     public string SecondBattingTeam { get; set; }
 }

sp_help フィクスチャの出力

Id          bigint (pk)
TeamID1     bigint
TeamID2         bigint
TeamWon         bigint
Date            datetime
SeasonId    bigint
ManOfTheMatch   bigint
FirstBattingTeam    bigint
SecondBattingTeam   bigint
ResultDescription   nvarchar
Team1Score  bigint
Team2Score  bigint
Team1Wickets    bigint
Team2Wickets    bigint

これは私の全体的な構造であり、上記のエラーが発生しています。グーグルで調べましたが、これに対する正確な解決策は得られませんでした。どんな助けでも大歓迎です。

私を助けてくれてありがとう、そしてアイデアを与えてくれたJon Skeetに特に感謝します

私の更新されたクエリを参照してください

 var data = from fixtures in Oritia_entities.Fixtures
                   join t1 in Oritia_entities.Teams on new { ID = fixtures.TeamID1 } equals new { ID = t1.ID }
                   join t2 in Oritia_entities.Teams on new { ID = fixtures.TeamID2 } equals new { ID = t2.ID }
                   where fixtures.SeasonId == seasionID
                   select new FixtureModel
                   {
                       Team1 = t1.TeamName,
                       Team2 = t2.TeamName,

                       Winners = SqlFunctions.StringConvert((double)(fixtures.TeamWon ?? 1)),
                       FirstBattingTeam = SqlFunctions.StringConvert((double)(fixtures.FirstBattingTeam ?? 1)),
                       SecondBattingTeam = SqlFunctions.StringConvert((double)(fixtures.SecondBattingTeam ?? 1)),
                       Team1Score = SqlFunctions.StringConvert((double)(fixtures.Team1Score ?? 1)),
                       Team1Wickets = SqlFunctions.StringConvert((double)(fixtures.Team1Wickets ?? 1)),
                       Team2Score = SqlFunctions.StringConvert((double)(fixtures.Team2Score ?? 1)),
                       Team2Wickets = SqlFunctions.StringConvert((double)(fixtures.Team2Wickets ?? 1))

                   };

文字列への変換にSqlFunctions.StringConvertを使用しましたが、現在は機能しています。皆さんありがとう。

4

4 に答える 4

3

それ以外の:

<% foreach (var item in ViewData["Fixtures"] as IEnumerable<DataAccess.FixtureModel>)

試す:

<% foreach (var item in Model)

.ToList()また、次のメソッドを使用してエンティティを熱心にロードしてみてください。

ViewData["Fixtures"] = fixtures.ToList();

また、 の代わりにビュー モデルを使用することを検討することもできますViewDataこれにより、コードがよりクリーンになり、魔法の文字列に依存しなくなります。


アップデート:

これを試して:

var fixtures = Oritia_entities
    .Fixtures
    .Where(f => f.SeasonId == seasionID)
    .ToList()
    .Select(f => new FixtureModel
    {
        Team1 = "",
        Team2 = "",
        Winners = (f.TeamWon+""),
        FirstBattingTeam = (f.FirstBattingTeam+""),
        SecondBattingTeam = (f.SecondBattingTeam+""),
        Team1Score = f.Team1Score + "",
        Team1Wickets = f.Team1Wickets + "",
        Team2Score = f.Team2Score + "",
        Team2Wickets = f.Team2Wickets + ""
    });
于 2012-07-05T05:50:42.160 に答える
2

LINQ クエリを書き直してみてください。

var fixtures = Oritia_entities.Fixtures
    .Where(fixtures => fixtures.SeasonId == seasionID)
    .AsEnumerable()
    .Select(fixtures => new FixtureModel
                    {

                        Team1 = "",
                        Team2 = "",
                        Winners = (fixtures.TeamWon+""),
                        FirstBattingTeam = (fixtures.FirstBattingTeam+""),
                        SecondBattingTeam = (fixtures.SecondBattingTeam+""),
                        Team1Score = fixtures.Team1Score + "",
                        Team1Wickets = fixtures.Team1Wickets + "",
                        Team2Score = fixtures.Team2Score + "",
                        Team2Wickets = fixtures.Team2Wickets + ""
                    }
    )
    .ToList();

LINQ クエリは基本的に同じですが、SQL に変換できる最後の基準の間に AsEnumerable() 呼び出しを入れました (これは Where(...) で、seasionID の型と値は何ですか? )、および選択 (...)。

理由は、L2S がどういうわけか Select(..) を SQL に変換しようとしていると思うからです。うまくいくかどうかはわかりませんが、試してみる価値があります。

于 2012-07-05T06:33:05.000 に答える
0

これを試してみてください...(ただし、最終的に使用する場合は、try catchを少し微調整します。エラーを抑制し、それについて何もしない/サイレントデスで死ぬことを許可することはお勧めしません;P)

 public string NullableObjectToString(object obj)
 {
      try
      {
          if (obj == null)
              return "";

          return (obj ?? string.Empty).ToString();
      }
      catch (Exception)
      {
          return "";
      }
  }

それで

var fixtures = from fixtures in Oritia_entities.Fixtures
                  where fixtures.SeasonId == seasionID
                  select new FixtureModel
                  {                        
                     Winners = NullableObjectToString(fixtures.TeamWon),
                     FirstBattingTeam = NullableObjectToString(fixtures.FirstBattingTeam) // ..... you get the idea
                  }
于 2012-07-05T06:50:05.303 に答える
0

これをコントローラーで使用します。

  ViewData["Fixtures"] = fixtures.ToArray();

よくわかりませんが、それがあなたの問題だと思います。ToArrayを使用しない場合は、 IQueryableをビューに送信しているため、問題が発生する可能性があります。

于 2012-07-05T05:59:10.630 に答える