BLToolkit中的表值函数

时间:2011-07-13 18:17:02

标签: linq user-defined-functions bltoolkit

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

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

1 个答案:

答案 0 :(得分:3)

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

[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)