我想将类的属性列表传递给函数。在基于属性列表的函数中,我将生成一个查询。与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,但这是一个很大的项目,我仍然无法从中获取任何有用的信息。
有人可以帮助我开始这个,或者有人可以给我一些有用的资源来阅读这个。
答案 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的一个功能来实现?是否试图将此作为扩展方法创建? 如果这不是你的意思,你需要重新讲述你的问题,并且正如一位评论者建议的那样,告诉我们你不需要我们如何设计它。