2017-06-29 1 views
0

私は現在、プロジェクトにリレーショナルデータベースを組み込もうとしています。私のプロジェクトでは、RDBMSの実装前に、通常、私は正常にこのコードを自分の希望する値にアクセスすることができます:asp.netエンティティフレームワークを使用してSQLの外部キーでデータを取得する方法?

public static string guitar { get; set; } 
public static List<stringInstrumentItem> GetGuitarItems() 
{ 
    List<stringInstrumentItem> list2 = new List<stringInstrumentItem>(); 

     MusicStoreDBEntities obj2 = new MusicStoreDBEntities(); 
     list2 = (from g in obj2.stringInstrumentItems where g.brand == guitar select g).ToList(); 


    return list2; 

} 

しかし、今、私はすでに私のsqlスクリプトで外部キーを設定することを、g.brandですこれはテキスト値を含まないため動作しません。これはbrandIdというintになりました。私の問題をよりよく理解するために、stringInstrumentItemテーブルのSQLスクリプトをここに示します。ここで私はブランドテーブルとそのプライマリキーを参照する外部キーbrandIdを設定します。

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[stringInstrumentItem](
[itemId] [int] NOT NULL, 
[type] [varchar](50) NOT NULL, 
[brandId] [int] FOREIGN KEY REFERENCES brand(brandId), 
[model] [varchar](50) NOT NULL, 
[price] [float] NOT NULL, 
[itemimage1] [varchar](255) NULL, 
[itemimage2] [varchar](255) NULL, 
[description] [text] NOT NULL, 
[necktype] [varchar](100) NOT NULL, 
[body] [varchar](100) NOT NULL, 
[fretboard] [varchar](100) NOT NULL, 
[fret] [varchar](50) NOT NULL, 
[bridge] [varchar](100) NOT NULL, 
[neckpickup] [varchar](100) NOT NULL, 
[bridgepickup] [varchar](100) NOT NULL, 
[hardwarecolor] [varchar](50) NOT NULL, 
PRIMARY KEY CLUSTERED 
(
[itemId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = 
OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 

ここにブランドテーブルがあります。これはstringInstrumentItemが参照しているテーブルです。

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[brand](
[brandId] [int] NOT NULL, 
[type] [varchar](50) NOT NULL, 
[name] [varchar](50) NOT NULL, 
[image] [varchar](255) NULL, 
PRIMARY KEY CLUSTERED 
(
[brandId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = 
OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 

私の目標は、asp.netとエンティティフレームワークを使用してstringInstrumentItemテーブルを通じてブランドのテーブルに名前と呼ばれるフィールドの値にアクセスできるようにすることです。私は本当にこれの答えを見つけていない。私はあなたがこの1つで私を助けることができることを願っています。

+1

最も簡単な方法は、2つのステップでそれを行うことです。まずidを取得し、そのidを持つオブジェクトを見つけます。 – pijemcolu

答えて

1

MusicStoreDBEntities内の2つの間に適切な関係がある場合は、g.brand.nameのようなブランド名にアクセスできるはずです。

list2 = (from g in obj2.stringInstrumentItems 
     where g.brand.name == guitar select g).ToList(); 
        ^^^^^^ 

そうでない場合は、手動でこのようにそれらを結合する必要があります -

list2 = (from g in obj2.stringInstrumentItems 
     join b in obj2.brand 
     on g.brandId equals b.brandId 
     where b.name == guitar 
     select g).ToList(); 
+0

あなたの権利、g.brand.nameは機能します。驚くばかり! – RockStar

+0

このフォーマットではどうですか?「SELECT COUNT(*)FROM stringInstrumentItem WHERE brandId LIKE @brand」?どのように私はこの形式でstringInstrumentItemを通じてブランドテーブルの名前と呼ばれるフィールドを取得しますか? – RockStar

+0

'.ToList()'の代わりに '.Count()'を使うことができます。 Countは整数値を返します。 – Win

0

はこれを試してみてください:

list2 = MusicStoreDBEntities.stringInstrumentItem. 
Where(x=> x.brand.name == "guitar").Select(x=> x).ToList(); 
関連する問題