[英]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.