2016-12-28 11 views
1

私はモデルファーストアプローチを使用してデータベースを作成しました。 AuthorBookID, AuthorID, BookID.すべてのこれらのテーブルはいくつかのデータを持っている特性を持つ多対多の接続をorginiseするために、プロパティAuthorID, Name, Surname. AuthorBookテーブルとプロパティBookID, Title. AuthorsBooks: は、私は3つのテーブルを持っています。 私は本のタイトル、またはこの本の著者名または姓を入力するテキストボックスを持っており、選択された(ストアドプロシージャによって)アイテムはDataGridに表示されます。 私はSQL Management StudioとVisual Studioのスクリプトでこの機能を実行するストアドプロシージャを作成しました。しかし、コードで正しく動作させる方法と、正しく使用する方法がわかりません。テキストボックスからデータを選択する方法

XAML:

<Canvas> 
    <TextBox x:Name="SearchBox" Width="193" Height="32" Canvas.Left="38" Canvas.Top="38"></TextBox> 
    <Button Name="SearchButton" Click="SearchButton_OnClick" Content="Search" Canvas.Left="204" Canvas.Top="80" Height="30" Width="64"></Button> 
    <DataGrid x:Name="Info" ItemsSource="{Binding Path=Authorslist1}" Background="Honeydew" Canvas.Top="200" Canvas.Left="30" Width="259" Height="50" ></DataGrid> 
</Canvas> 

C#:

public partial class UserPage : Window 
{ 
    Model1Container db1 = new Model1Container(); 
    private MainWindow mv = new MainWindow(); 

    public UserPage(Model1Container d, MainWindow m) 
    { 
     InitializeComponent(); 
     DataContext = this; 
     db1 = d; 
     mv = m; 
    } 


    private void SearchButton_OnClick(object sender, RoutedEventArgs e) 
    { 


    } 

スクリプト:

CREATE PROCEDURE [dbo].AuthorProcedure1 @name nvarchar(50) AS SELECT BookSet.Title, AuthorSet.Name, AuthorSet.Surname FROM [dbo].AuthorBookSet JOIN BookSet ON BookSet.BookID=AuthorBookSet.BookID JOIN AuthorSet ON AuthorSet.AuthorID=AuthorBookSet.AuthorID WHERE [email protected] GO

+0

あなたのモデルが正しくかなりあるナビゲーションプロパティを使用して構成されている場合単純なLINQクエリ(ストアドプロシージャの必要はありません)しかし、する必要があります:http://stackoverflow.com/questions/20901419/how-to-call-stored-procedure-inentity-framework-6-code-first –

+0

@ SteveGreene私はapprを発見していない残念ながらそこに自分自身のための解決策を選びなさい。はい、私はストアドプロシージャを使用している –

+0

何を試しましたか?ストアドプロシージャが返すフィールドのモデルを作成しましたか? var result = context.Database.SqlQuery ( "AuthorProcedure1"、bookTitle).ToList();呼び出しを作成しましたか? ? –

答えて

1

[OK]を、コメント要約:

1)パラメータ設定)

public class BookViewModel 
{ 
    public string Title { get; set; } 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 

2とprocの呼び出し::結果を保持(または匿名型を使用)するモデルを作成のItemsSourceを設定

var bookTitle = new SqlParameter("@name", txtSearch.Text); 
var result = context.Database.SqlQuery<BookViewModel>("AuthorProcedure1 @name", bookTitle).ToList(); 
+0

それは動作します、ありがとう!しかし、ここではストアドプロシージャは何もしていないようです?手順の中で言われているようにタイトルと著者の両方を得ることがどうにかできますか?どのようにそれがスクリプト の手続きで行われているのか、そしてlinqではなく手続きで行うのですか? –

+0

どういう意味ですか?これは、ストアドプロシージャを呼び出して、すべての3つのプロパティを持つオブジェクトを返しています。 ORMアスペクトを望まない場合は、ADO.NETを使用してください。 –

+0

次に、このプロシージャの結果(例えば、タイトルと作者の両方)のデータグリッドを取得する方法は? –

0

I can write like this and get only titles:

var bookTitle = new SqlParameter("@name", SearchBox.Text); 
var result = db1.Database.SqlQuery<BookViewModel>("AuthorProcedure1 @name", bookTitle).ToList(); 
Info.ItemsSource = (from s in result group s by s.Title into res select new { MyTitle = res.Key }).ToList(); 

it's shown in datagrid through binding. And how to get authors?

をListへのDataGridのプロパティ<BookViewModel>。このリストは、あなたのストアドプロシージャから返された著者が含まれます。ここでは

var result = db1.Database.SqlQuery<BookViewModel>("AuthorProcedure1 @name", bookTitle).ToList(); 
Info.ItemsSource = result; 

<DataGrid x:Name="Info" AutoGenerateColumns="False" Background="Honeydew" Canvas.Top="200" Canvas.Left="30" 
        Width="259" Height="50" > 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Title" Binding="{Binding Title}" /> 
     <DataGridTextColumn Header="Name" Binding="{Binding Name}" /> 
     <DataGridTextColumn Header="Surname" Binding="{Binding Surname}" /> 
    </DataGrid.Columns> 
</DataGrid> 
0

は、ソリューションです:

var bookTitle = new SqlParameter("@name", SearchBox.Text); var result = db1.Database.SqlQuery<BookAuthorViewModel>("AuthorProcedure1 @name", bookTitle).ToList(); 
Info.ItemsSource = result; 
関連する問題