Automapper有一个非常好的扩展来获取投影。
在我们应用程序的 BL 中,我们可以定义这样的方法:
IEnumerable<TEntityProjection> GetProjections()
{
return _context.EntitiesSet.Project().To<TEntityProjection>();
}
这有助于BL保持非常简单。对于每个投影变体,我们不需要许多不同的方法。
但。。。WCF 服务不支持开放泛型。
所以我正在寻找允许服务客户端仅获取实体所需属性的解决方案。
可能的解决方案是 Linq over WCF(基于 BLToolkit)。在后台,linq 查询解析为 SqlQuery (SQL AST),序列化并发送到 WCF LINQService。该服务为数据库(SQl Server,Oracle,MySql等)创建一个sql查询,执行它并返回数据。支持匿名类型。
查询示例:
var client = new DataModel();
var q = from p in client.Person
select new
{
p.PersonID,
p.FirstName,
p.MiddleName,
p.LastName,
p.Gender
};
foreach (var p in q)
Console.WriteLine(p);
更多信息: http://bltoolkit.net/Doc.LinqDataContext.ashx
样品:https://github.com/igor-tkachev/bltoolkit/blob/master/Demo/Linq/OverWCF/Program.cs
这不会以您尝试的方式工作。
如果需要接收端的特定属性,可以:
- 创建单独的方法,其中每个方法公开每个实体的特定预定义属性集
- 创建采用"属性列表"参数(可能是字符串数组)并返回带有 XML 或 JSON 的字符串的方法,然后需要在客户端上进行一些程序集
- 只需忽略客户端上不需要的属性
我想这取决于您的具体情况,哪个是最好的。