gpt4 book ai didi

c# - 同时编写 SQL 投影和映射?

转载 作者:太空宇宙 更新时间:2023-11-03 20:00:06 25 4
gpt4 key购买 nike

这可以从我们数据库的地址对象中分离出一个 DDL 对象:

public class DDL {
public int? id { get; set; }
public string name { get; set; }
}

List<DDL> mylist = Addresses
.Select( q => new DDL { id = q.id, name = q.name })
.ToList();

但是,我们希望将 POCO 到 ViewModel 的映射保存在 MVC Controller 代码之外的一个地方。我们想做这样的事情:

List<DDL> mylist = Addresses
.Select( q => new DDL(q)) // <-- constructor maps POCO to VM
.ToList();

但是SQL不能使用构造函数。上面的对象初始值设定项不使用函数来映射字段。当然,您可以执行 .AsEnumerable().Select( q => new DDL(q)),但这会选择 SQL 中的所有字段(包括数据),将其发送到 C#,然后是 C#划分出我们需要的字段(传输我们不需要的数据效率极低。)

有什么建议吗?我们恰好在使用 Entity Framework 6 来拉取数据。

最佳答案

您只需在某处定义表达式并使用它。例如,在您的 ViewModel 中作为静态只读字段。

public class SomeViewModel
{
public static readonly Expression<Func<SomeEntity, SomeViewModel>> Map = (o) => new SomeViewModel
{
id = o.id,
name = o.name
}

public int id { get; set; }
public string name { get; set; }
}

// Somewhere in your controller
var mappedAddresses = Addresses.Select(SomeViewModel.Map);

我亲自为自己制作了一个小型静态映射器,它保留所有 map 并为我使用它们。在我所有的 ViewModel 中,这些映射都是在静态初始值设定项中声明的。结果给了我一些感觉像 AutoMapper 的东西,但不需要库或复杂的映射代码(但也不会为你做任何魔术)。

我可以这样写:

MyCustomMapper.Map<Entity, ViewModel>(entity);

它重载以接受 IEnumerables、IQueryables 和单个 ViewModel。我还添加了仅具有 1 个接受类型参数的泛型类型(实体)的重载。这是对我的要求。

关于c# - 同时编写 SQL 投影和映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29418472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com