簡體   English   中英

將lambda表達式作為參數傳遞

[英]Passing lambda expression as parameter

我有幾個表都具有相同的列domainID ,這些表基本上只控制哪些數據在哪個網站上顯示,因為它們共享一個數據庫。

因此,當我將表數據綁定到控件時,我需要創建一個大型開關來處理不同的LINQ查詢。 我想創建一個實用程序方法,該方法將表類型作為參數,然后基於傳遞的表中的列返回where子句。

public static IEnumerable<T> ExecuteInContext<T>(
               IQueryable<T> src)
        {
             int domain = 1;//hard coded for example

             return src.Where(x => x.DomainID == domain);//Won't work, has to be a way to do this.            
        }

我被卡在返回代碼上。 您不能像我目前那樣簡單地構造一個where子句,因為它不知道我在說什么表。

我試圖像這樣調用第一個方法:

using (DataClasses1DataContext db = new DataClasses1DataContext())
        {

            var q = Utility.ExecuteInContext(db.GetTable<item>());

            Repeater1.DataSource = q;
            Repeater1.DataBind();
        }

我希望這可以解釋我正在嘗試做的事情。

編輯: BrokenGlass的答案解決了我的問題。 我想補充一點,您需要打開.dbml.cs文件並使用您的界面擴展表/類。 我還想指出,如果我的列可為空,則該項目將不會生成,它表示返回的類型與我的接口不同。

您必須將T限制為具有DomainID屬性的DomainID -您可以在擴展數據模型的部分類中添加這些接口實現。

public interface IFoo
{
    int DomainId { get; set; }
}
..

public static IQueryable<T> ExecuteInContext<T>(IQueryable<T> src) where T: IFoo
{
  int domain = 1;//hard coded for example
  return src.Where(x => x.DomainID == domain);
}
Expression pe = Expression.Parameter(typeof(T));
Expression prope = Expression.Property(pe, "DomainID");
Expression ce = Expression.Equals(prope, 
    Expression.Constant((int)1);

Expression<Func<T,bool>> exp =
Expression.Lambda<Func<T,bool>>(
    ce, pe);

return query.Where(exp);

您應該能夠將通用參數轉換為預期的類型...

public static IEnumerable<T> ExecuteInContext<T>(IQueryable<T> src)
{
    int domain = 1;//hard coded for example

    return src.Where(x => ((T)x).DomainID == domain);
}

但是您意識到您已經創建了一個通用方法,該方法假定其類型參數將始終公開特定屬性? 如果要這樣做,則應應用通用類型約束 ,以便T始終從具有該屬性的類型派生而來...

例如:

public static IEnumerable<T> ExecuteInContext<T>(IQueryable<T> src) where T : IMyDomainObject

我不確定我是否理解您的意思,但也許您想添加where子句:

public static IEnumerable<T> ExecuteInContext<T>(IQueryable<T> src)     

     where T: MyType //MyType exposing your DomainId   
    {             
       int domain = 1;//hard coded for example            
        return src.Where(x => x.DomainID == domain);//Won't work, has to be a way to do this.                    
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM