1

我想将一个类的属性列表传递给一个函数。在基于属性列表的函数中,我将生成一个查询。与 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 表达式来完成。但我不确定输入参数和返回类型是什么。*)

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 表达式方面的专家。

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

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

4

1 回答 1

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 选择样本

更新: 那么您是否正在尝试做这样的事情呢?

   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 的功能?是否试图将其创建为扩展方法?如果这不是您的意思,您需要重新表述您的问题,正如一位评论者建议的那样,告诉我们您需要什么而不是您希望我们如何设计它。

于 2012-04-03T05:49:39.873 回答