C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: LINQ to SQLのJOINについて


(過去ログ 85 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■50518 / inTopicNo.1)  LINQ to SQLのJOINについて
  
□投稿者/ ケント (1回)-(2010/06/09(Wed) 19:54:55)

分類:[.NET 全般] 

Visual Studio 2008 SP1 + C#でデータベース(SQL Server 2005)アクセスをしています。
LINQ to SQLのデザイナを用いて、テーブル間の関連付けを行おうとしたのですが、
下記のようなエラーが発生して関連付けできませんでした。

------
関連付け "USER_TANTO" を作成できません。プロパティに一致する型がありません: "tanto_id"、"id"。
------

各テーブルを簡略化すると以下のようになります。

USERテーブル
{
id INT NOT NULL,
name VARCHAR NOT NULL,
tanto_id INT
}
TANTOテーブル
{
id INT NOT NULL,
name VARCHAR NOT NULL,
}

結合条件は以下のような感じを想定しています。
USER LEFT OUTER JOIN TANTO ON USER.tanto_id = TANTO.id

「一致する型がありません」のエラーはUSERテーブルのtanto_idにNOT NULL制約がついていないために起こっているようです。
データの内容的に、USERにTANTOがつかない場合がありますので、tanto_idにNOT NULL制約を付けるわけにはいきません。

うまく解決する方法はないでしょうか?
引用返信 編集キー/
■50519 / inTopicNo.2)  Re[1]: LINQ to SQLのJOINについて
□投稿者/ いしだ (230回)-(2010/06/09(Wed) 20:21:38)
http://msdn.microsoft.com/ja-jp/library/bb399397.aspx

ここの下から4番目の例が参考になりませんか?
引用返信 編集キー/
■50525 / inTopicNo.3)  Re[2]: LINQ to SQLのJOINについて
□投稿者/ ケント (2回)-(2010/06/10(Thu) 09:40:10)
いしださん。ありがとうございます。

LINQ to SQLのクエリでの取得はできるようです。
ただ、今回デザイナを用いて関連付けしている理由は、
自動的なModelの生成に頼りたいためでした。
(ASP.NET MVC の強く型付けされたViewを楽に使うため)

デザイナに頼らず、Modelを新たに定義すべきでしょうか?
引用返信 編集キー/
■50533 / inTopicNo.4)  Re[3]: LINQ to SQLのJOINについて
□投稿者/ かたぎり (30回)-(2010/06/10(Thu) 13:24:58)
ViewがReadOnlyなのでしたら、
SQLServer側でSchemaBindingViewを作成して、
それをあたかもテーブルのようにデザイナに持ってくる、というのはいかがでしょう?
引用返信 編集キー/
■50553 / inTopicNo.5)  Re[4]: LINQ to SQLのJOINについて
□投稿者/ ケント (3回)-(2010/06/10(Thu) 17:01:05)
かたぎりさん。ありがとうございます。

今回はLINQ to SQLのクエリでLEFT JOINして、
検索結果を自分で書いたクラスに入れるという方法をとりました。

LEFT OUTER JOINは、ごく普通の結合なので、
LINQ to SQLのデザイナでも本当はできるのではないか?
(私がデザイナの使い方を理解していないだけではないか?)
という気がしています。

----------

// 自分で定義
public class ListUser
{
    public USER User { get; set; }
    public TANTO Tanto { get; set; }
}

// LINQ to SQLでの読み出し
public class UserManager
{
    public IQueryable<ListUser> getList()
    {
        UserDataContext db = new UserDataContext();
        var list = (from sysuser in db.USER
                        join tanotoset in db.TANTO on sysuser.tanto_id equals tanotoset.id into tantos
                        from tanto in tantos.DefaultIfEmpty()
                        select new ListUser { User = sysuser, Tanto = tanto });
        return list;
    }
}


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -