0

表示したいビューがあり、文字列(StudentID)を受け入れるコントローラーがあります。これが私のコントローラーのアクションです:

public ActionResult ShowStudent(string StudentID)
{
    ViewData.Model = student.vwStudent.Where(s => s.StudentID == StudentID);
    return View();
}

ここで、StudentIdには先行ゼロが含まれています。例:00003345、000000223など。したがって、特定の学生のビューを表示するには、URLに正確な文字列「00003345」を入力する必要があります。「http:// Student / ShowStudent/00003345」を表示できるようにしたいURLに「3345」と入力しても表示されます:「http:// Student / ShowStudent / 3345」が、エラーが発生します。

文字列の代わりにLong(Int64)パラメータを渡して、ViewData.ModelでStudentIDをStringに変換してみました。

ViewData.Model = student.vwStudent.Where(s => s.StudentID == StudentID.ToString());

しかし、エラーが発生します:

LINQ to Entitiesは、メソッド'System.String ToString()'メソッドを認識せず、このメソッドをストア式に変換できません。

編集:次のようにInt64に解析するだけの何が問題になっていますか?

ViewData.Model = student.vwStudent.Where(s => Int64.Parse(s.StudentID) == Int64.Parse(StudentID));
4

5 に答える 5

4

次は機能しますか?

public ActionResult ShowStudent(string StudentID)
{
    var padded = StudentID.PadLeft(8, '0');
    ViewData.Model = student.vwStudent.Where(s => s.StudentID == padded);
    return View();
}

または、StudentIDが常に8文字に追加されるとは限らない場合は、基になるSQLLIKE演算子を使用してすべての可能なStudentIDを照会する必要があります。

var students = student.vwStudent.Where(s => s.StudentID.EndsWith(StudentID));

次に、これらの結果をループして、適切な一致を探します。

最後に、基になるSQL IN演算子を使用して、可能なすべての一致をクエリに送信し、正確な戻り値を取得したい場合は、次のようにします。

public ActionResult ShowStudent(string StudentID)
{
    var possibleStudents = Enumerable.Range(StudentID.Length, 8 - StudentID.Length).Select(l => StudentID.PadLeft(l, '0'));
    ViewData.Model = student.vwStudent.Where(s => possibleStudents.Contains(s.StudentID));
    return View();
}
于 2012-04-11T23:42:58.603 に答える
2

データベースが大きなintを保持していて、それをより小さなものに送信している場合....を取得していstack overflowます。その文字列を何か便利なものに解析する必要があります。

ViewData.Model = student.vwStudent.Where(s => s.StudentID == long.Parse(StudentID));

ただし、これは問題ではないようです(質問には、「文字列を大きなintに変換する方法」が明確に記載されていますが)。

あなたの説明(StudentId's have leading zeros in them)とあなたのコメントから、I have to enter it exactly "00003345"私はこのメソッドがいくつかのロジックを必要とすると仮定します。一方、StudentIdsの長さが異なるとの質問があるため、よくわかりません。?!

public ActionResult ShowStudent(string StudentID)
{
 while( StudentID.Length < 8 )
 {
  StudentID = "0" + StudentID;
 }
 ViewData.Model = student.vwStudent.Where(s => s.StudentID == StudentID);
 return View();
}

またはさらに楽しい:

public ActionResult ShowStudent(string StudentID)
{
 var x = student.vwStudent.Where(s => s.StudentID == StudentID).FirstOrDefault();
 while( x != null && StudentID.Length < 15)
 {
  StudentID = "0" + StudentID;
  x = student.vwStudent.Where(s => s.StudentID == StudentID).FirstOrDefault();
 }
 ViewData.Model = x;
 return View();
}

またはわずかに乾燥機:

public ActionResult ShowStudent(string StudentID)
{
    Student s;
    while( (s=students.FirstOrDefault( x => x.StudentId == StudentId )) == null ) {
        StudentId = "0" + StudentId;
        if( StudentId.Length > 15 ) break;
    }

    return View( s );
}
于 2012-04-11T23:43:31.360 に答える
2

LINQは、すべての関数を基になるデータストアに変換できる必要があります。これが、おそらくエラーメッセージが表示される理由です。しかし、私があなたの問題を正しく理解していれば、あなたはあなたが探していることを以下で達成することができるはずです:

public ActionResult ShowStudent(long studentId)
{
    var studentIdStr = studentId.ToString( "D9" );  // 9-digit number, padded w/ zeros
    ViewData.Model = student.vwStudent.Where(s => s.StudentId == studentIdStr);
    return View();
}

ちなみに、モデルをビューに渡す標準的な方法は、を設定することではなく、メソッドViewData.Modelに渡すことです。View

public ActionResult ShowStudent(long studentId)
{
    var studentIdStr = studentId.ToString( "D9" );  // 9-digit number, padded w/ zeros
    return View( student.vwStudent.Where(s => s.StudentID == studentIdStr) );
}
于 2012-04-11T23:44:24.073 に答える
1

これは興味深い質問です。StudendIDが先行ゼロとともに格納されている場合、組み込みのMVC関数はすべて同じ値(先行ゼロを意味する)でURLを構築します。ただし、Controllerメソッドを変更して文字列を取得し、それをInt64に変換してから、自分でゼロを追加して.PadLeft()も、モデルのバインドは引き続き機能します。

public ActionResult ShowStudent(string StudentID) 
{ 
    string paddedStudentID = Convert.ToInt64(StudentID).ToString().PadLeft(9, '0');
    ViewData.Model = student.vwStudent.Where(s => s.StudentID == paddedStudentID); 
    return View(); 
} 

しかし、これが多くの価値をもたらすかどうかはわかりません。

于 2012-04-11T23:46:07.757 に答える
0

助けてくれてありがとう、私はあなたのアドバイスのすべてを少し取って、私のために働く解決策に行き着きました。

SQLでキャストすることでこれを解決できました:

CAST(CAST(StudentID AS bigint) AS nvarchar(33)) AS StudentID 

そしてそれを私のコントローラーで変換します:

var StudentID = Convert.ToString(Int64.Parse(StudentId));

ViewData.Model = student.vwStudent.Where(a => a.StudentID == StudentId);
于 2012-04-13T19:29:42.740 に答える