将Linq表达式传递给函数

本文关键字:函数 Linq 表达式 | 更新日期: 2023-09-27 18:29:44

我想将类的属性列表传递给函数。在基于属性列表的函数中,我将生成一个查询。与LinqSelect方法中的功能完全相同。在这里,我将为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; }
}

我想调用这样的选择函数,

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

然后,使用result我可以获得Name和Address属性的值。

我想我的选择功能应该是这样的,

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

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的功能的尝试。但我不是林克表达的专家。

麻省理工学院有一个名为DbLinq的项目,但这是一个大项目,我仍然无法从中获得任何帮助

有人能帮我开始这个吗,或者有人能链接我一些有用的资源来阅读这个。

将Linq表达式传递给函数

您要做的是创建一个由Name和Address组成的新匿名类型。这很容易通过长格式linq实现(由于没有更好的解释,我编造了这个术语。)以下是微软的一个示例,链接如下:

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的一个函数来实现?你是想把它创建为一个扩展方法吗?如果这不是你的意思,你需要重新表述你的问题,正如一位评论者所建议的,告诉我们你需要什么,而不是你希望我们如何设计它。