Insert、Update、および Delete ストアド プロシージャを指定できるようですが、SELECT ストアド プロシージャを直接指定する方法はありません。
3 に答える
エンティティは何らかのテーブルまたはビューにマップする必要があるため、あなたが探しているのは正確には不可能だと思います。ストアド プロシージャは、エンティティを定義できるものではありません。
ただし、実行時にエンティティを返すよう Linq2Sql に指示するストアド プロシージャのマッピングを作成し、DataContext クラスにメソッドを配置して sproc を実行し、エンティティのリストを取得することは確かに可能です。これらのエンティティは、通常のテーブル マッピングから作成されたエンティティと同じように機能するため、それらに対して SubmitChanges() を呼び出すと、そのエンティティ タイプ用に作成した Insert/Update/Delete sproc が使用されます。
おそらく最善の方法は、Scott Guthrie によるこのウォークスルーを見ることでしょう。
これは実行可能ですが、ビジュアル ドラッグ アンド ドロップ ツールを使用することはできません。次の 3 つのことを行う必要があります。
データを「取得」するために呼び出される datacontext クラスから新しいメソッドを作成します
public partial class DatabaseDataContext { [Function(Name = "dbo.Contact_Get")] [ResultType(typeof(Contact))] [ResultType(typeof(int))] public IMultipleResults GetContacts([Parameter(Name = "PageIndex", DbType = "Int")] System.Nullable<int> pageIndex, [Parameter(Name = "PageSize", DbType = "Int")] System.Nullable<int> pageSize, [Parameter(Name = "Sort", DbType = "NVarChar(10)")] string sort, [Parameter(Name = "ContactTypeId", DbType = "Int")] System.Nullable<int> contactTypeId) { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), pageIndex, pageSize, sort, contactTypeId); return ((IMultipleResults)(result.ReturnValue)); }
}
CustomPages フォルダー内で選択元を制御する特定のテーブルの新しいページ テンプレート (たとえば、List.aspx) を作成します。
グリッドビューの選択メカニズムを制御します。
protected void GridDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e) { DatabaseDataContext db = new DatabaseDataContext(); IMultipleResults results = db.GetContacts(e.Arguments.StartRowIndex, e.Arguments.MaximumRows, e.Arguments.SortExpression, (int?)e.WhereParameters["ContactTypeId"]); e.Result = results.GetResult<Contact>().ToList(); e.Arguments.TotalRowCount = results.GetResult<int>().Single<int>();
}
これを行う方法を示す DD の codeplex サイトの Dynamic Data SP サンプルを確認してください。
http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=14473
linq-to-sql は非常に悪い考えです...
しかし、このsprocはあなたが望むことを可能にするはずです
create PROCEDURE [dbo].[usp_GetCompanies] (
@in_filter nvarchar(2000)
)
AS
declare @sql nvarchar(max)
begin
set @sql = '
SELECT
c.id as company_id, c.name as company_name
FROM company c
WHERE id is not null ' + @in_filter + ' order by c.type, c.name '
exec sp_executesql @sql
end
return