10

私は多少経験のある Rails 開発者で、MVC の ASP.NET バージョンを試してみようと思いました。そうすることで、Linq->Sql... も試してみることにしました。

Linq->Sql が結合を処理する方法について少し混乱しています。

私のスキーマの簡単な例は次のとおりです。

書籍:
id
タイトル

カテゴリ:
ID
名前

books_categories :
book_id
カテゴリID

これらのテーブルを .dbml ファイルにドラッグするだけでは、うまくいかないようです。Book クラスの books_categories でプロパティを取得します。期待するのは、繰り返し処理して Category クラスを直接取得できるプロパティです。

今、私は非常に間違っていると感じる何かをしなければなりません

        foreach (books_categories bc in book.books_categories)
        {
            category_names.Add(bc.Category.category.Trim());
        }

【採用された回答に対して】
「グルーコードを自分で書いてください」という回答をしぶしぶ受け入れました。Linq->Sql の調査を続けた後、(より強力な IMO) Entity Framework を支持して、Linq->Sql が明らかにゆっくりと手放されていることを発見しました。EF ではクエリに LINQ を使用することができ、Ruby の ActiveRecord のような関係を適切に把握できます。

4

4 に答える 4

8

Book の部分クラス実装を使用し、カテゴリとそのプロパティに適切なメソッドを追加します。プロパティを Books_Categories プロパティのフロントエンドにします (これを非公開にして、Categories プロパティを通じて実装を強制することができます)。

public partial class Books
{
    public IEnumerable<string> CategoryNames
    {
       get
       {  
            return this.Books_Categories
                       .Select( bc => bc.Category.category.Trim() );
       }
    }

    public void AddCategory( Category category )
    {
       this.Books_Categories.Add( new Book_Category
                                  {
                                      Category = category,
                                      Book = this
                                  } );
    }

    public void RemoveCategory( Category category )
    {
       var bc = this.Book_Categories
                    .Where( c => c.Category == category )
                    .SingleOrDefault();
       this.Books_Categories.Remove( bc );
    }
}

明らかに、エラー/境界チェックなどを追加する必要がありますが、アイデアは得られます。

これが理想的ではないことは認めますが、少なくとも、それがどのように機能するかを柔軟に決定できます。

于 2009-01-24T21:30:26.860 に答える
2

Entity Framework では多対多のマッピングが明示的にサポートされていますが、LINQ to SQL ではサポートされていません。NHibernate などのサードパーティの ORM を使用することもできます。

于 2009-01-26T15:49:18.910 に答える
0

本を作成し、それに直接カテゴリを追加したい場合にできることは、次のとおりです。

        <p>
            <label for="CategorySelect">Category:</label>
            <%= Html.ListBox("CategorySelect") %>
            <%= Html.ValidationMessage("CategorySelect", "*")%>
        </p>  

あなたのブックコントローラーで:

        public ActionResult New()
    {
            var data = _entities.Categories.ToList();
        ViewData["CategorySelect"] = new MultiSelectList(data, "Id", "Name");
}

        [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult New([Bind(Exclude = "Id")] Book Booknew)
    {
        IEnumerable<int> selectedCategories = Request["CategorySelect"].Split(new Char[] { ',' }).Select(idStr => int.Parse(idStr));

        if (!ModelState.IsValid)
            return View();

        try {
            foreach(var item in selectedCategories){
                BooksCategories bc = new BooksCategories();
                bc.Book = Booknew;
                bc.CategoryId = item;
                _entities.BooksCategories.InsertOnSubmit(bc);
            }
            _entities.Books.InsertOnSubmit(Booknew);
            _entities.SubmitChanges();
于 2009-05-12T11:01:27.220 に答える
0

Linq to Sql では期待される結果がサポートされていないと思います。

あなたがしていることは間違っていると感じるかもしれませんが、それが L2S の制限を回避する 1 つの方法だと思います。

おい、私は本当にRailsに取り込まなければならない...

于 2009-01-24T21:19:14.807 に答える