.NET 3.5(13) - DLINQ(LINQ to SQL)之用户自定义函数

步步为营VS 2008 + .NET 3.5(13) - DLINQ(LINQ to SQL)之用户自定义函数、在不同的DataContext之间做更新、缓存、获取信息、数据加载选项和延迟加载



作者:webabcd


介绍
以Northwind为示例数据库,DLINQ(LINQ to SQL)之调用标量值用户自定义函数;调用表值用户自定义函数;使用数据加载选项加载数据;相关信息的获取;字段的延迟加载;在不同的DataContext之间做更新缓存


示例
Others.aspx.cs

InBlock.gif using System;
InBlock.gif using System.Data;
InBlock.gif using System.Configuration;
InBlock.gif using System.Collections;
InBlock.gif using System.Linq;
InBlock.gif using System.Web;
InBlock.gif using System.Web.Security;
InBlock.gif using System.Web.UI;
InBlock.gif using System.Web.UI.WebControls;
InBlock.gif using System.Web.UI.WebControls.WebParts;
InBlock.gif using System.Web.UI.HtmlControls;
InBlock.gif using System.Xml.Linq;
InBlock.gif
InBlock.gif using DAL;
InBlock.gif
InBlock.gif public partial class LINQ_DLINQ_Others : System.Web.UI.Page
InBlock.gif{
InBlock.gif         protected void Page_Load( object sender, EventArgs e)
InBlock.gif        {
InBlock.gif                 // 调用标量值用户自定义函数
InBlock.gif                Call_HelloFunctionScalar();
InBlock.gif
InBlock.gif                 // 调用表值用户自定义函数
InBlock.gif                Call_HelloFunctionTable();
InBlock.gif
InBlock.gif                 // 不使用数据加载选项
InBlock.gif                DataLoadOptions_Original();
InBlock.gif
InBlock.gif                 // 使用数据加载选项加载数据
InBlock.gif                DataLoadOptions_LoadWith();
InBlock.gif
InBlock.gif                 // 使用数据加载选项加载数据,并且限制所要加载的数据
InBlock.gif                DataLoadOptions_AssociateWith();
InBlock.gif
InBlock.gif                 // 相关信息的获取
InBlock.gif                GetInfo();
InBlock.gif
InBlock.gif                 // 字段的延迟加载
InBlock.gif                DelayLoaded();
InBlock.gif
InBlock.gif                 // 在不同的DataContext之间做更新
InBlock.gif                IsVersion();
InBlock.gif
InBlock.gif                 // 缓存
InBlock.gif                ShowCache();
InBlock.gif        }
InBlock.gif}

 

调用标量值用户自定义函数
ALTER FUNCTION dbo.fnHelloFunctionScalar
(
        @param nvarchar(100)
)
RETURNS nvarchar(200)

AS

BEGIN
        
        RETURN 'Hello:' + @param
        
END

InBlock.gif /// <summary>
InBlock.gif         /// 调用标量值用户自定义函数
InBlock.gif         /// </summary>
InBlock.gif         void Call_HelloFunctionScalar()
InBlock.gif        {
InBlock.gif                NorthwindDataContext ctx = new NorthwindDataContext();
InBlock.gif
InBlock.gif                result.InnerHtml += ctx.HelloFunctionScalar( "webabcd");
InBlock.gif                result.InnerHtml += "<br />";
InBlock.gif                result.InnerHtml += "<br />";
InBlock.gif        }

运行结果
Hello:webabcd

调用表值用户自定义函数

ALTER FUNCTION dbo.fnHelloFunctionTable
(
        @ID int,
        @name nvarchar(100)
)
RETURNS @tbl TABLE ([ID] int, [Name] nvarchar(100))
AS

BEGIN
        
        INSERT INTO @tbl VALUES (@ID, @name)
                    
        RETURN
        
END
/// <summary>
InBlock.gif         /// 调用表值用户自定义函数
InBlock.gif         /// </summary>
InBlock.gif         void Call_HelloFunctionTable()
InBlock.gif        {
InBlock.gif                NorthwindDataContext ctx = new NorthwindDataContext();
InBlock.gif
InBlock.gif                var p = (ctx.HelloFunctionTable(1, "webabcd")).Single();
InBlock.gif
InBlock.gif                result.InnerHtml += "ID:" + p.ID;
InBlock.gif                result.InnerHtml += "<br />";
InBlock.gif                result.InnerHtml += "Name:" + p.Name;
InBlock.gif                result.InnerHtml += "<br />";
InBlock.gif                result.InnerHtml += "<br />";
InBlock.gif        }
运行结果
ID:1
Name:webabcd


不使用数据加载选项
/// <summary>
InBlock.gif         /// 不使用数据加载选项
InBlock.gif         /// </summary>
InBlock.gif         void DataLoadOptions_Original()
InBlock.gif        {
InBlock.gif                NorthwindDataContext ctx = new NorthwindDataContext();
InBlock.gif
InBlock.gif                var categories = from c in ctx.Categories select c;
InBlock.gif
InBlock.gif                 foreach (var c in categories)
InBlock.gif                {
InBlock.gif                         // 每一次迭代都会执行一条SQL语句来返回当前Category的Product
InBlock.gif                         foreach (var p in c.Products)
InBlock.gif                        {
InBlock.gif                                 string productName = p.ProductName + "<br>";
InBlock.gif                        }
InBlock.gif                }
InBlock.gif        }
// SELECT [t0].[CategoryID], [t0].[CategoryName], [t0].[Description], [t0].[Picture]
// FROM [dbo].[Categories] AS [t0]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1

// SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
// FROM [dbo].[Products] AS [t0]
// WHERE [t0].[CategoryID] = @p0
// -- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [1]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1

// SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
// FROM [dbo].[Products] AS [t0]
// WHERE [t0].[CategoryID] = @p0
// -- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [2]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1

// SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
// FROM [dbo].[Products] AS [t0]
// WHERE [t0].[CategoryID] = @p0
// -- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [3]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1

// SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
// FROM [dbo].[Products] AS [t0]
// WHERE [t0].[CategoryID] = @p0
// -- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [4]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1

// SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
// FROM [dbo].[Products] AS [t0]
// WHERE [t0].[CategoryID] = @p0
// -- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [5]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1

// SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
// FROM [dbo].[Products] AS [t0]
// WHERE [t0].[CategoryID] = @p0
// -- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [6]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1

// SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
// FROM [dbo].[Products] AS [t0]
// WHERE [t0].[CategoryID] = @p0
// -- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [7]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1

// SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
// FROM [dbo].[Products] AS [t0]
// WHERE [t0].[CategoryID] = @p0
// -- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [8]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
 
使用数据加载选项加载数据
/// <summary>
InBlock.gif         /// 使用数据加载选项加载数据
InBlock.gif         /// </summary>
InBlock.gif         void DataLoadOptions_LoadWith()
InBlock.gif        {
InBlock.gif                NorthwindDataContext ctx = new NorthwindDataContext();
InBlock.gif                System.Data.Linq.DataLoadOptions options = new System.Data.Linq.DataLoadOptions();
InBlock.gif
InBlock.gif                 // Category以LEFT JOIN的方式关联Product
InBlock.gif                options.LoadWith<Categories>(c => c.Products);
InBlock.gif                ctx.LoadOptions = options;
InBlock.gif
InBlock.gif                var categories = from c in ctx.Categories select c;
InBlock.gif
InBlock.gif                 foreach (var c in categories)
InBlock.gif                {
InBlock.gif                         foreach (var p in c.Products)
InBlock.gif                        {
InBlock.gif                                 string productName = p.ProductName + "<br>";
InBlock.gif                        }
InBlock.gif                }
InBlock.gif        }
// SELECT [t0].[CategoryID], [t0].[CategoryName], [t0].[Description], [t0].[Picture], [t1].[ProductID], [t1].[ProductName], [t1].[SupplierID], [t1].[CategoryID] AS [CategoryID2], [t1].[QuantityPerUnit], [t1].[UnitPrice], [t1].[UnitsInStock], [t1].[UnitsOnOrder], [t1].[ReorderLevel], [t1].[Discontinued], (
//         SELECT COUNT(*)
//         FROM [dbo].[Products] AS [t2]
//         WHERE [t2].[CategoryID] = [t0].[CategoryID]
//        ) AS [ count]
// FROM [dbo].[Categories] AS [t0]
// LEFT OUTER JOIN [dbo].[Products] AS [t1] ON [t1].[CategoryID] = [t0].[CategoryID]
// ORDER BY [t0].[CategoryID], [t1].[ProductID]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
 

使用数据加载选项加载数据,并且限制所要加载的数据
/// <summary>
InBlock.gif         /// 使用数据加载选项加载数据,并且限制所要加载的数据
InBlock.gif         /// </summary>
InBlock.gif         void DataLoadOptions_AssociateWith()
InBlock.gif        {
InBlock.gif                NorthwindDataContext ctx = new NorthwindDataContext();
InBlock.gif                System.Data.Linq.DataLoadOptions options = new System.Data.Linq.DataLoadOptions();
InBlock.gif
InBlock.gif                 // Category以LEFT JOIN的方式关联Product
InBlock.gif                options.LoadWith<Categories>(c => c.Products);
InBlock.gif                 // 限制所关联的Product
InBlock.gif                options.AssociateWith<Categories>(c => c.Products.Where(p => p.UnitPrice > 20));
InBlock.gif                ctx.LoadOptions = options;
InBlock.gif
InBlock.gif                var categories = from c in ctx.Categories select c;
InBlock.gif
InBlock.gif                 foreach (var c in categories)
InBlock.gif                {
InBlock.gif                         foreach (var p in c.Products)
InBlock.gif                        {
InBlock.gif                                 string productName = p.ProductName + "<br>";
InBlock.gif                        }
InBlock.gif                }
InBlock.gif        }
// SELECT [t0].[CategoryID], [t0].[CategoryName], [t0].[Description], [t0].[Picture], [t1].[ProductID], [t1].[ProductName], [t1].[SupplierID], [t1].[CategoryID] AS [CategoryID2], [t1].[QuantityPerUnit], [t1].[UnitPrice], [t1].[UnitsInStock], [t1].[UnitsOnOrder], [t1].[ReorderLevel], [t1].[Discontinued], (
//         SELECT COUNT(*)
//         FROM [dbo].[Products] AS [t2]
//         WHERE ([t2].[UnitPrice] > @p0) AND ([t2].[CategoryID] = [t0].[CategoryID])
//        ) AS [ count]
// FROM [dbo].[Categories] AS [t0]
// LEFT OUTER JOIN [dbo].[Products] AS [t1] ON ([t1].[UnitPrice] > @p0) AND ([t1].[CategoryID] = [t0].[CategoryID])
// ORDER BY [t0].[CategoryID], [t1].[ProductID]
// -- @p0: Input Currency (Size = 0; Prec = 19; Scale = 4) [20]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
 
相关信息的获取
/// <summary>
InBlock.gif         /// 相关信息的获取
InBlock.gif         /// </summary>
InBlock.gif         void GetInfo()
InBlock.gif        {
InBlock.gif                NorthwindDataContext ctx = new NorthwindDataContext();
InBlock.gif
InBlock.gif                var categories = from c in ctx.Categories select c;
InBlock.gif
InBlock.gif                result.InnerHtml += "ProviderType:" + ctx.Mapping.ProviderType.ToString() + "<br />";
InBlock.gif
InBlock.gif                result.InnerHtml += "DatabaseName:" + ctx.Mapping.DatabaseName + "<br />";
InBlock.gif
InBlock.gif                result.InnerHtml += "ContextType:" + ctx.Mapping.ContextType.ToString() + "<br />";
InBlock.gif
InBlock.gif                result.InnerHtml += "TableName:" + ctx.Mapping.GetTable( typeof(Categories)).TableName + "<br />";
InBlock.gif
InBlock.gif                result.InnerHtml += "Expression:" + categories.Expression.ToString() + "<br />";
InBlock.gif
InBlock.gif                result.InnerHtml += "T-SQL:" + categories.Provider.ToString() + "<br />";
InBlock.gif        }
 
运行结果
ProviderType:System.Data.Linq.SqlClient.SqlProvider
DatabaseName:C:\DOCUMENTS AND SETTINGS\WANGLEI\桌面\VS2008\WEB\APP_DATA\NORTHWIND.MDF
ContextType:DAL.NorthwindDataContext
TableName:dbo.Categories
Expression:Table(Categories).Select(c => c)
T-SQL:SELECT [t0].[CategoryID], [t0].[CategoryName], [t0].[Description] FROM [dbo].[Categories] AS [t0]


字段的延迟加载
/// <summary>
InBlock.gif         /// 字段的延迟加载
InBlock.gif         /// </summary>
InBlock.gif         void DelayLoaded()
InBlock.gif        {
InBlock.gif                 // 在对象关系设计器(Object Relational Designer)中设置Categories实体的Picture属性的Delay Loaded为True
InBlock.gif
InBlock.gif                NorthwindDataContext ctx = new NorthwindDataContext();
InBlock.gif
InBlock.gif                var category = (from c in ctx.Categories
InBlock.gif                                                select c).Single(c => c.CategoryID == 1);
InBlock.gif
InBlock.gif                System.Data.Linq.Binary b = category.Picture;
InBlock.gif        }
// SELECT [t0].[CategoryID], [t0].[CategoryName], [t0].[Description]
// FROM [dbo].[Categories] AS [t0]
// WHERE [t0].[CategoryID] = @p0
// -- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [1]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1

// SELECT [t0].[Picture]
// FROM [dbo].[Categories] AS [t0]
// WHERE [t0].[CategoryID] = @p0
// -- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [1]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
 
在不同的DataContext之间做更新
/// <summary>
InBlock.gif         /// 在不同的DataContext之间做更新
InBlock.gif         /// </summary>
InBlock.gif         void IsVersion()
InBlock.gif        {
InBlock.gif                 // 在Categories实体的主键上添加属性IsVersion=true,即Time Stamp为True
InBlock.gif
InBlock.gif                Categories c = null;
InBlock.gif
InBlock.gif                 using (NorthwindDataContext ctx = new NorthwindDataContext())
InBlock.gif                {
InBlock.gif                        ctx.DeferredLoadingEnabled = false;
InBlock.gif                        c = ctx.Categories.First();
InBlock.gif                        c.Description = "webabcd";
InBlock.gif                }
InBlock.gif
InBlock.gif                 using (NorthwindDataContext ctx = new NorthwindDataContext())
InBlock.gif                {
InBlock.gif                        ctx.Categories.Attach(c, true);
InBlock.gif                        ctx.SubmitChanges();
InBlock.gif                }
InBlock.gif        }
// UPDATE [dbo].[Categories]
// SET [CategoryName] = @p2, [Description] = @p3
// WHERE ([CategoryID] = @p0) AND ([CategoryID] = @p1)
// -- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [1]
// -- @p1: Input Int32 (Size = 0; Prec = 0; Scale = 0) [1]
// -- @p2: Input String (Size = 9; Prec = 0; Scale = 0) [Beverages]
// -- @p3: Input String (Size = 7; Prec = 0; Scale = 0) [webabcd]
// -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
 
缓存
/// <summary>
InBlock.gif         /// 缓存
InBlock.gif         /// </summary>
InBlock.gif         void ShowCache()
InBlock.gif        {
InBlock.gif                 // 查询后数据会被缓存,如果之后以主键查询的话,会先在缓存里查找
InBlock.gif
InBlock.gif                NorthwindDataContext ctx = new NorthwindDataContext();
InBlock.gif
InBlock.gif                Categories category = ctx.Categories.Single(c => c.CategoryName == "Beverages");
InBlock.gif                Categories category2 = ctx.Categories.Single(c => c.CategoryName == "Beverages");
InBlock.gif
InBlock.gif                Categories category3 = ctx.Categories.Single(c => c.CategoryID == 1);
InBlock.gif                Categories category4 = ctx.Categories.Single(c => c.CategoryID == 1);
InBlock.gif
InBlock.gif                Categories category5 = ctx.Categories.Single(c => c.CategoryID == 2);
InBlock.gif                Categories category6 = ctx.Categories.Single(c => c.CategoryID == 2);
InBlock.gif        }
SELECT [t0].[CategoryID], [t0].[CategoryName], [t0].[Description]
FROM [dbo].[Categories] AS [t0]
WHERE [t0].[CategoryName] = @p0
-- @p0: Input String (Size = 9; Prec = 0; Scale = 0) [Beverages]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1

SELECT [t0].[CategoryID], [t0].[CategoryName], [t0].[Description]
FROM [dbo].[Categories] AS [t0]
WHERE [t0].[CategoryName] = @p0
-- @p0: Input String (Size = 9; Prec = 0; Scale = 0) [Beverages]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1

SELECT [t0].[CategoryID], [t0].[CategoryName], [t0].[Description]
FROM [dbo].[Categories] AS [t0]
WHERE [t0].[CategoryID] = @p0
-- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [2]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
 

本文出自 “webabcd” 博客,请务必保留此出处http://webabcd.blog.51cto.com/1787395/345019

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值