将Linq Expression传递给函数

时间:2012-04-03 05:26:38

标签: c# linq anonymous-function linq-expressions dblinq

我想将类的属性列表传递给函数。在基于属性列表的函数中,我将生成一个查询。与Linq Select方法完全相同的功能。 在这里,我将为Ingress数据库实现这一点。

举个例子,

在前端我想运行一个选择,

我的实体类就像这样

public class Customer
{
    [System.Data.Linq.Mapping.ColumnAttribute(Name="Id",IsPrimaryKey=true)]
    public string Id { get; set; }

    [System.Data.Linq.Mapping.ColumnAttribute(Name = "Name")]
    public string Name { get; set; }

    [System.Data.Linq.Mapping.ColumnAttribute(Name = "Address")]
    public string Address { get; set; }

    [System.Data.Linq.Mapping.ColumnAttribute(Name = "Email")]
    public string Email { get; set; }

    [System.Data.Linq.Mapping.ColumnAttribute(Name = "Mobile")]
    public string Mobile { get; set; }
}

我想调用这样的Select函数,

var result = dataAccessService.Select<Customer>(C=>C.Name,C.Address);

然后,使用结果我可以得到名称和地址属性的值。

我认为我的Select功能应该是这样的,

(*我认为这应该使用Linq Expression完成。但我不确定输入参数和返回类型是什么。*)

Class DataAccessService
{
   // I'm not sure about this return type and input types, generic types.
   public TResult Select<TSource,TResult>(Expression<Func<TSource,TResult>> selector)
   {
        // Here I wanna Iterate through the property list, which is passed from the caller.
        // Here using the property list, 
        // I can get the ColumnAttribute name value and I can generate a select query.
   }
}

这是尝试创建Linq中的功能。但我不是Linq Expressions的专家。

麻省理工学院有一个项目电话DbLinq,但这是一个很大的项目,我仍然无法从中获取任何有用的信息。

有人可以帮助我开始这个,或者有人可以给我一些有用的资源来阅读这个。

1 个答案:

答案 0 :(得分:1)

您要做的是创建一个由名称和地址组成的新匿名类型。这可以通过长形式linq轻松实现(由于缺乏更好的解释,我提出了这个术语。)以下是Microsoft的一个示例,链接如下:

public void Linq11() 
{ 
    List<Product> products = GetProductList(); 

    var productInfos = 
        from p in products 
        select new { p.ProductName, p.Category, Price = p.UnitPrice }; 

    Console.WriteLine("Product Info:"); 
    foreach (var productInfo in productInfos) 
    { 
        Console.WriteLine("{0} is in the category {1} and costs {2} per unit.", productInfo.ProductName, productInfo.Category, productInfo.Price); 
    } 
}

详细信息:Linq Select Samples

<强>更新 所以你想尝试做这样的事情吗?

   var result = dataAccessService.Select<Customer>(c => c.Name, c => c.Address);

public object[] Select<TSource>(params Expression<Func<TSource, object>>[] selectors)
   {
       var toReturn = new object[selectors.Count()];

       foreach (var s in selectors)
       {
           var func = s.Compile();
           //TODO: If you implement Select a proper extension method, you can easily get the source
           toReturn[i] = func(TSource);
       }
        return toReturn;
   }

我不明白你为什么要尝试将Select作为DataAccessService的一个功能来实现?是否试图将此作为扩展方法创建? 如果这不是你的意思,你需要重新讲述你的问题,并且正如一位评论者建议的那样,告诉我们你不需要我们如何设计它。