gpt4 book ai didi

c# - 检索选定列的 Entity Framework 中的可重用映射方法

转载 作者:行者123 更新时间:2023-11-30 22:04:50 25 4
gpt4 key购买 nike

我在这里的 Entity Framework 中有 2 个以下查询:

示例 1:

var c1 = context.CardholderEntities.Where(c => c.IsActive).Select(Mapper.Map).ToList();

示例 2:

var c2 = context.CardholderEntities.Where(cc => cc.IsActive).Select(cc => new Cardholder
{
Id = cc.Id,
CardholderNo = cc.CardholderNo
}).ToList();

这是我的映射器的样子

    internal static Cardholder Map(CardholderEntity entity)
{
if (entity == null) return null;
return new Cardholder
{
Id = entity.Id,
CardholderNo = entity.CardholderNo
};
}

现在,当我在 SQL 分析器中运行这两个语句时,在第一个语句中,我会得到:

SELECT 
[Extent1].[Id] AS [Id],
[Extent1].[CardholderNo] AS [CardholderNo],
[Extent1].[IsVisitor] AS [IsVisitor],
[Extent1].[Name] AS [Name],
[Extent1].[NRIC] AS [NRIC],
[Extent1].[DepartmentId] AS [DepartmentId],
[Extent1].[Photo] AS [Photo],
[Extent1].[Handphone] AS [Handphone],
[Extent1].[Remark] AS [Remark],
[Extent1].[IsAMRMode] AS [IsAMRMode],
[Extent1].[IssueNo] AS [IssueNo],
[Extent1].[UserId] AS [UserId],
[Extent1].[SurName] AS [SurName]
FROM [dbo].[Cardholder] AS [Extent1]
WHERE [Extent1].[IsActive] = 1

在第二个中,我会得到

SELECT 
[Extent1].[Id] AS [Id],
[Extent1].[CardholderNo] AS [CardholderNo]
FROM [dbo].[Cardholder] AS [Extent1]
WHERE [Extent1].[IsActive] = 1

现在,我想要的只是检索 2 列的查询。

我的问题是:

1) 为什么 entityframework 会这样?

2) 我如何重构我的映射器,以便它可以保留为可重用方法,而不是像第二个示例那样必须手动映射它们。

最佳答案

在 Exmaple 2 中, Entity Framework 使用 System.Linq.Expressions.Expression 进行 sql 查询。将表达式传递给 Select 就像传递“函数定义”,EF 从表达式中进行 poper sql 查询

当您像示例 1 一样传递一个函数时,EF 只知道您的函数需要实体,这就是 EF 查询实体的所有属性的原因。

您必须将 Expression 传递给 Select,您需要将函数更改为:

internal static System.Linq.Expressions.Expression<Func<CardholderEntity, Cardholder>> Map  = m => new Cardholder { CardholderNo = m.CardholderNo, Id = m.Id };

这不是那么简单,但我希望我解释一下。您应该创建自己的函数来获取 System.Linq.Expressions.Expression<Func<>>>作为参数,看看 expression 和 func 到底是什么;)

关于c# - 检索选定列的 Entity Framework 中的可重用映射方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24858613/

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