從 EF 核心的類/對像以編程方式創建 MemberInitExpression

弗里茨

使用EntityFramework-Plus Update 方法我需要一個 MemberInitExpression 作為參數。

await _db.Users
    .Where(u => u.Username == user.Username)
    .UpdateAsync(x => new User { Username = "manfred" });

但是,我想以編程方式從給定的 User 對象(不僅僅是示例中的用戶名)設置所有屬性。

我想以編程方式執行此操作,以避免在開發週期後期丟失用戶對像上新添加的屬性。

編輯:我嘗試過這樣的事情,但是這不起作用,我無法設置值

Type t = User.GetType();
PropertyInfo[] props = t.GetProperties();

ParameterExpression paramExp = Expression.Parameter(typeof(User));
NewExpression newHolder = Expression.New(typeof(User));
var memberBindings = new List<MemberBinding>();
foreach (var prop in props)
{
    var methodInfo = prop.GetMethod;
    //var binding = Expression.Bind(methodInfo, paramExp);
    var binding = Expression.Bind(methodInfo, Expression.Parameter(methodInfo.GetType(), methodInfo.Name));
    memberBindings.Add(binding);
}
MemberInitExpression memberInitExpression =
    Expression.MemberInit(
        newHolder, memberBindings);
伊万·斯托耶夫

所以,你有變量

User user;

持有User來自某處的實例。而你想要表達

(User x) => new User { Prop1 = user.Prop1, Prop2 = user.Prop2, ... }

這是參數x和主體確實是 lambda 表達式MemberInitExpressionnew User對應於NewExpression,裡面MemberBinding賦值是s。的第一個參數Expression.Bind只是PropertyInfo,第二個參數Expression.Property應用於保存變量值(實例)的常量表達式它必須是常數,因為它不是來自參數。userUser

拿你的代碼

IEnumerable<PropertyInfo> props = t.GetProperties();

它可以從 EF Core 元數據中獲取,並且還必須進行調整以至少排除 PK 屬性,但假設它包含PropertyInfo要應用的列表,則可以按如下方式構建所需的綁定:

var memberBindings = props
    .Select(prop => Expression.Bind(
        prop, Expression.Property(Expression.Constant(user), prop)))
    .ToList();

或者,user可以評估變量屬性並將其作為常量傳遞(不確定這是否會影響Update方法):

var memberBindings = props
    .Select(prop => Expression.Bind(
        prop, Expression.Constant(prop.GetValue(user), prop.PropertyType)))
    .ToList();

其餘代碼與原帖相同。ToList不是真的需要,可以從上面的代碼中刪除,因為Expression.MemberInit接受IEnumerable<MemberBinding>.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  3. 3

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  4. 4

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  5. 5

    Gerenciar recurso shake de Windows Aero com barra de título personalizado

  6. 6

    Como obter dados API adequados para o aplicativo angular?

  7. 7

    UITextView não está exibindo texto longo

  8. 8

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  9. 9

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  10. 10

    Usando o plug-in Platform.js do Google

  11. 11

    Como posso modificar esse algoritmo de linha de visada para aceitar raios que passam pelos cantos?

  12. 12

    Dependência circular de diálogo personalizado

  13. 13

    Coloque uma caixa de texto HTML em uma imagem em uma posição fixa para site para desktop e celular

  14. 14

    iOS: como adicionar sombra projetada e sombra de traço no UIView?

  15. 15

    Como usar a caixa de diálogo de seleção de nomes com VBA para enviar e-mail para mais de um destinatário?

  16. 16

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  17. 17

    How to create dynamic navigation menu select from database using Codeigniter?

  18. 18

    Converter valores de linha SQL em colunas

  19. 19

    ChartJS, várias linhas no rótulo do gráfico de barras

  20. 20

    用@StyleableRes注释的getStyledAttributes。禁止警告

  21. 21

    não é possível adicionar dependência para com.google.android.gms.tasks.OnSuccessListener

quentelabel

Arquivo