2011-07-13 36 views

回答

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)