【问题标题】:Table-value functions in BLToolkitBLToolkit 中的表值函数
【发布时间】:2011-07-13 18:17:02
【问题描述】:

是否可以通过使用 BLToolkit 库来使用 SQL Server 表值函数?

我想在 Linq 查询中使用它,但我在库 wiki 上找不到任何相关信息。

【问题讨论】:

    标签: linq user-defined-functions bltoolkit


    【解决方案1】:

    在数据上下文类中定义您的函数,如下所示:

    [TableFunction(Name="GetParentByID")]
    public Table<Parent> GetParentByID(int? id)
    {
        return GetTable<Parent>(this, (MethodInfo)MethodBase.GetCurrentMethod(), id);
    }
    

    用法:

    [Test]
    public void Func2()
    {
        using (var db = new TestDbManager())
        {
            var q =
                from c in db.Child
                from p in db.GetParentByID(2)
                select p;
    
            q.ToList();
        }
    }
    

    SQL:

    SELECT
        [t2].[ParentID],
        [t2].[Value1]
    FROM
        [Child] [t1], [GetParentByID](2) [t2]
    

    您也可以在数据上下文之外定义它:

    public class Functions
    {
        private readonly IDataContext _ctx;
    
        public Functions(IDataContext ctx)
        {
            _ctx = ctx;
        }
    
        [TableFunction]
        public Table<Parent> GetParentByID(int? id)
        {
            return _ctx.GetTable<Parent>(this, (MethodInfo)(MethodBase.GetCurrentMethod()), id);
        }
    
        [TableExpression("{0} {1} WITH (TABLOCK)")]
        public Table<T> WithTabLock<T>()
            where T : class 
        {
            return _ctx.GetTable<T>(this, ((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(T)));
        }
    }
    
    [Test]
    public void Func1()
    {
        using (var db = new TestDbManager())
        {
            var q =
                from p in new Functions(db).GetParentByID(1)
                select p;
    
            q.ToList();
        }
    }
    
    [Test]
    public void WithTabLock()
    {
        using (var db = new TestDbManager())
        {
            var q =
                from p in new Functions(db).WithTabLock<Parent>()
                select p;
    
            q.ToList();
        }
    }
    

    SQL:

    SELECT
        [p].[ParentID],
        [p].[Value1]
    FROM
        [GetParentByID](1) [p]
    
    SELECT
        [p].[ParentID],
        [p].[Value1]
    FROM
        [Parent] [p] WITH (TABLOCK)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多