2

私は MVC3、C# で作業しており、Razor を使用しています。私は一貫して MVC を扱っていないので、常に再学習する必要があります... (指定された州の) 学校のリストと (その学校の) 生徒のネストされたリストを表示するビューが必要ですミドルネームは「ボブ」。

十分に単純に思えますが、これまでのところ解決策を見つけることができません。

例: 見る

メリーランド州の結果

私の最初の学校: - ビリー・ボブ・ジョンソン - サリー・ボブ・シンプソン - アダム・ボブ・ジョーンズ

別の学校: - アーノルド・ボブ・スミス - キャシー・ボブ・パワーズ - ジェニー・ボブ・スミス

他の学校: - バーニー・ボブ・エドソン - スー・ボブ・パーディー - アラン・ボブ・ウォーフィールド

public class School
{ 
   public int SchoolId {get; set;} 
   public string Schoolname {get; set;} 
   public int StateId {get; set;} 
} 


public class Student
{ 
   public int StudentId {get; set;}
   public int SchoolId {get; set;} 
   public string Firstname {get; set;} 
   public string Middlename {get; set;} 
   public string Lastname {get; set;} 
} 


public class SchoolViewModel
{ 
   public int SchoolId {get; set;}
   public string Schoolname {get; set;}  
   public IEnumerable<Student> Bobs { get; set; }
} 

JOINS で SELECT を実行してリストを取得すると、上記のように VIEW に表示するために追加の作業が必要なデータ セットが得られます。データセットが多次元配列のように機能するように、ネストされた学生のリストを取得する方法があると考えています。しかし、私はそのアプローチの例を見つけていません-それは方法ではないと思います... ?? LINQ / MVC / ViewModel などを最大限に活用する方法でデータを取得するにはどうすればよいですか? :)

私はこのようなことを試みていました-しかし、これが正しい方向であるかどうかはわかりません-そして、ボブを設定しようとするとエラーが発生しました. :)

次のようなエラーが表示されます: LINQ to Entities はメソッド 'System.Linq.IQueryable`1[stuff] GetBobs(stuff)' メソッドを認識しません。このメソッドはストア式に変換できません。

  private IQueryable<SchoolViewModel> GetSchools(int StateId)
  {
        var query = from s in db.Schools
                    where s.State == StateId
                    orderby s.Schoolname
                    select new SchoolViewModel
                    {
            SchoolId = s.SchoolId,
                        Name = s.Name,
                        Bobs = GetBobs(s.SchoolId)
                    };
    var results = query;
        return results;
    }

    private IQueryable<Student> GetBobs(int id)
    {

        var query = from s in db.Students
                    where s.Middlename == 'Bob'
                    where s.SchoolId == id
                    select s;

        var results = query;
        return results;
    }
4

2 に答える 2

2

クエリ部分に対していつでもこれを行うことができます。それがあなたがつまずいているところだと思います:

var schools = db.Schools
     .Where(x => x.State == "<Whatever>")
     .Select(x => new {
          School = x,
          Bobs = x.Where(y => y.MiddleName == "Bob")
     }).ToList();

List<Schools> schoolsView = new List<Schools>();
foreach(var x in schools)
{
     schoolsView.Add(new SchoolsViewModel(){
          //Set Properties here
          SchooldID = x.School.ID,
          SchoolName = x.School.Name,
          Students = x.Bobs.ToList() //You can project here if needed.
     };
}

return schoolsView;

次に、ビューに対してこれをさまざまな方法で実行できますが、固定出力を備えた具体的な ViewModel がある場合は、ネストされたループになります。

<ul>
@foreach(var m in Model)  //Assuming your model is a list of SchoolViewModels
{
     <li>@m.SchoolName
          <ul>
               @foreach(var s in m.Students)
               {
                    <li>@s.Name</li>
               }
          </ul>
     </li>
}
</ul>

String.Join(",", Model.Students)リストの出力などを行うためのかわいいオプションもありますが、これはあなた次第です。

編集:追加の説明

また、モデルを少し変更する必要があります。使用している EF バージョンはわかりませんが、EF4.1+ ではナビゲーション プロパティを指定して、明示的な結合条件の必要性をなくすことができます (これは、終わり)。

http://msdn.microsoft.com/en-us/library/bb738520.aspx

したがって、Schools モデルは次のようになります。

public class School
{ 
   public int SchoolId {get; set;} 
   public string Schoolname {get; set;} 
   public int StateId {get; set;} 
   public virtual IList<Student> Students {get; set; }
} 

そして、DB構成で(流暢を使用している場合、構成は次のようになります:

modelBuilder.Entity<School>()
     .HasMany(x => x.Students).WithRequired();

そうすれば、あなたは実行する力を得る

db.Schools
    .Where(x => x.Name.Contains("Some Value"))
    .Include(x => x.Schools.Where(x => x.MiddleName.Contains("SomeValue")))
    .ToList();

これにより、あいまいな型定義を使用する必要なく、以前のクエリがさらに単純になります。

この説明が少しでも役立つことを願っています。

于 2012-07-25T16:13:32.520 に答える
1

このようなことを試して、データを表示できます。

最上位ビュー:

@model SchoolViewModel
@using (Html.BeginForm()) 
{
    <fieldset>
        @Html.EditorFor(x => x.Bobs)
        <input type="submit" value="Save" />
    </fieldset>
}

その後、表示目的でエディタ テンプレートを使用できます。次の URL で作成します: ~/Views/Shared/EditorTemplates/Student.cshtml

@model Student
@Html.DisplayFor(x => x.StudentID)
@Html.DisplayFor(x => x.SchoolID)
@Html.DisplayFor(x => x.FirstName)
@Html.DisplayFor(x => x.MiddleName)
@Html.DisplayFor(x => x.LastName)

その後、生成されたサブリストに任意の書式を設定できます。Bobs IEnumerable の各 Student は、エディター テンプレートで定義したルールに従ってレンダリングされます。

実際にデータベースにクエリを実行する限り、次のパターンに沿ってある種のリポジトリを作成します。

public interface IRepository<TEntity> where TEntity : class
{
    List<TEntity> FetchAll();
    IQueryable<TEntity> Query { get; }
    void Add(TEntity entity);
    void Delete(TEntity entity);
    void Save();
}  

具体的な実装は次のようになります。

public class SQLRepository<T> : IRepository<T> where T : class
{
    private DataContext db;
    public SQLRepository()
    {
        this.db = new TestDataContext();
    }
    public void Add(T entity)
    {
        db.GetTable(Of T)().InsertOnSubmit(entity)
    }
    public void Delete(T entity)
    {
        db.GetTable(Of T)().DeleteOnSubmit(entity)
    }
    public System.Collections.Generic.List<T> FetchAll()
    {
        return Query.ToList();
    }
    public System.Linq.IQueryable<T> Query {
        get { return db.GetTable<T>(); }
    }
    public void Save()
    {
        db.SubmitChanges()
    }
}
于 2012-07-25T16:19:59.780 に答える