web-dev-qa-db-ja.com

LINQ toEntities-エンティティから単一の文字列値を返す方法

私はaspmvc3アプリで作業しています。私は歴史と呼ばれるモデル/エンティティを持っています。 1つの値を返すlinqクエリがあります。何をするかに応じて、メソッドが呼び出されたときにコントローラーで「オブジェクトがインスタンスに設定されていません」というエラーが発生するか、「文字列からModels.History型に暗黙的に変換できません」というエラーが発生します。だから私は解決の助けを探しています、私はそれか何かをキャストする必要がありますか?

'オブジェクトが設定されていません'エラーを発生させるメソッドは次のとおりです。

public string GetPastAbuseData(int Id)
{

  var query = (from h in _DB.History
              where h.ApplicantId.Equals(Id)
              select h.AbuseComment).FirstOrDefault();

  return query.ToString();
 }

コントローラー:vm.HistoryModel.AbuseComment = repo.GetPastAbuseData(Id);

また、メソッドタイプを文字列から履歴に変更すると、「変換できません」というエラーが発生します。

public History GetPastAbuseData(int Id)
{
    return (from h in _DB.History
            where h.ApplicantId.Equals(Id)
            select h.AbuseComment).SingleOrDefault();
}

お時間をいただきありがとうございます。

7
BattlFrog

AbuseCommentからHistoryObjectプロパティ(文字列)を選択しています。したがって、コードは文字列をHistoryに変換しようとします。 Historyエンティティ全体を返すだけです:

_public History GetPastAbuseData(int Id)
{
    return (from h in _DB.History
            where h.ApplicantId.Equals(Id)
            select h).SingleOrDefault();
}
_

また、最初のケースでは、queryは文字列型になります。この変数でToStringを呼び出す必要はありません。さらに、OrDefault()の場合に該当すると、NullReferenceExceptionになります。

_public string GetPastAbuseData(int Id)
{
  return (from h in _DB.History
          where h.ApplicantId.Equals(Id)
          select h.AbuseComment).FirstOrDefault();
}
_
12

最初の例は問題ありません。nullをチェックするだけです。

public string GetPastAbuseData(int Id)
{

    var query = (from h in _DB.History
          where h.ApplicantId.Equals(Id)
          select h.AbuseComment).FirstOrDefault();

    return query == null ? string.empty : query;
 }
4
mojo722

Nullかどうかをチェックし、string.Emptyを返すnull合体演算子を使用できます。 ??演算子

public string GetPastAbuseData(int Id)
{
     return _DB.History.FirstOrDefault(h=>h.ApplicantId.Equals(Id)).Select(h=>h.AbuseComment) ?? string.Empty;
}
2
nerdybeardo