C# 将Linq表达式传递给函数

C# 将Linq表达式传递给函数,c#,linq,anonymous-function,linq-expressions,dblinq,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; }

我想将类的属性列表传递给函数。在基于属性列表的函数中,我将生成一个查询。与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; }
}
我想调用这样的选择函数

var result = dataAccessService.Select<Customer>(C=>C.Name,C.Address);
var result=dataAccessService.Select(C=>C.Name,C.Address);
然后,使用result可以得到Name和Address属性的值

我想我的选择函数应该是这样的

var result = dataAccessService.Select<Customer>(C=>C.Name,C.Address);
(*我认为这应该使用Linq表达式来完成。但我不确定输入参数和返回类型是什么。*)

类数据访问服务
{
//我不确定这个返回类型和输入类型,泛型类型。
公共树结果选择(表达式选择器)
{
//在这里,我想遍历调用方传递的属性列表。
//这里使用属性列表,
//我可以获取ColumnAttribute名称值并生成一个select查询。
}
}
这是一种创建类似Linq的功能的尝试。但我不是Linq表达式的专家

麻省理工学院有一个项目电话,但这是一个大项目,我仍然无法从中得到任何有用的东西


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

你要做的是创建一个由姓名和地址组成的新匿名类型。这很容易通过长格式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); 
    } 
}
public void Linq11()
{ 
List products=GetProductList();
var productInfos=
产品中的p
选择新{p.ProductName,p.Category,Price=p.UnitPrice};
Console.WriteLine(“产品信息:”);
foreach(productInfos中的var productInfo)
{ 
Console.WriteLine(“{0}属于{1}类,每单位成本为{2}”)、productInfo.ProductName、productInfo.category、productInfo.Price);
} 
}
详情:

更新: 那么你是想做这样的事吗

   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;
   }
var result=dataAccessService.Select(c=>c.Name,c=>c.Address);
公共对象[]选择(参数表达式[]选择器)
{
var toReturn=新对象[selectors.Count()];
foreach(选择器中的变量s)
{
var func=s.Compile();
//TODO:如果实现Select适当的扩展方法,您可以很容易地获得源代码
toReturn[i]=func(TSource);
}
回归回归;
}
我不明白你为什么要把Select作为DataAccessService的一个功能来实现?您是否试图将其创建为扩展方法,而不是?
如果这不是你的意思,你需要重新表述你的问题,正如一位评论者所建议的,告诉我们你不需要什么,你希望我们如何设计它。

你试图做的是创建一个由姓名和地址组成的新匿名类型。这很容易通过长格式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); 
    } 
}
public void Linq11()
{ 
List products=GetProductList();
var productInfos=
产品中的p
选择新{p.ProductName,p.Category,Price=p.UnitPrice};
Console.WriteLine(“产品信息:”);
foreach(productInfos中的var productInfo)
{ 
Console.WriteLine(“{0}属于{1}类,每单位成本为{2}”)、productInfo.ProductName、productInfo.category、productInfo.Price);
} 
}
详情:

更新: 那么你是想做这样的事吗

   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;
   }
var result=dataAccessService.Select(c=>c.Name,c=>c.Address);
公共对象[]选择(参数表达式[]选择器)
{
var toReturn=新对象[selectors.Count()];
foreach(选择器中的变量s)
{
var func=s.Compile();
//TODO:如果实现Select适当的扩展方法,您可以很容易地获得源代码
toReturn[i]=func(TSource);
}
回归回归;
}
我不明白你为什么要把Select作为DataAccessService的一个功能来实现?您是否试图将其创建为扩展方法,而不是?
如果这不是你的意思,你需要重新表述你的问题,正如一位评论者所建议的,告诉我们你需要什么,而不是你希望我们如何设计它。

不确定你想要实现什么。。。你想得到所有客户的姓名和地址吗?Kalin,在我的Select方法中,我想迭代通过的poperty列表。在我的例子中,它应该是只给我名字和地址属性。你描述了你想要做什么。你能描述一下你为什么想做这件事,也就是说,你想实现什么目标吗?我想我已经提到了我想生成一个类似于Linq的查询为什么要创建一个新的
Select
函数,而不是实现
IQueryable
并依赖预定义的
Queryable。Select
?不确定要实现什么。。。你想得到所有客户的姓名和地址吗?Kalin,在我的Select方法中,我想迭代通过的poperty列表。在我的例子中,它应该是只给我名字和地址属性。你描述了你想要做什么。你能描述一下你为什么想做这件事,也就是说,你想实现什么目标吗?我想我已经提到了我想生成一个像Linq中那样的查询为什么你要创建一个新的
Select
函数,而不是实现
IQueryable
并依赖预定义的
Queryable。Select
?很抱歉,duluca,你没有得到它,我想把这个匿名类型传递到一个函数中,在函数中,我想迭代