将lambda表达式作为参数传递

时间:2011-04-08 19:34:41

标签: c# linq-to-sql

我有一些表都有相同的列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文件并使用您的界面扩展表/类。我还想指出,如果我的列可以为空,那么项目就不会构建,它说它与我的界面的返回类型不同。

4 个答案:

答案 0 :(得分:3)

您必须将T限制为具有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);
}

答案 1 :(得分:2)

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

答案 2 :(得分:0)

您应该能够将通用参数转换为预期类型...

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

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

但是你意识到你已经创建了一个泛型方法,假设它的类型参数总是暴露一个特定的属性?如果您要这样做,则应该应用generic type constraint,以便T始终从具有该属性的类型派生...

例如:

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

答案 3 :(得分:0)

我不确定我是否明白你的意思,但也许你想添加一个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.                    
    }