将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的项目,但这是一个大项目,我仍然无法从中获得任何帮助
有人能帮我开始这个吗,或者有人能链接我一些有用的资源来阅读这个。
您要做的是创建一个由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的一个函数来实现?你是想把它创建为一个扩展方法吗?如果这不是你的意思,你需要重新表述你的问题,正如一位评论者所建议的,告诉我们你需要什么,而不是你希望我们如何设计它。