2010-07-20 2 views
0

Я работаю с новым EF4 CTP4, хотя я не думаю, что это имеет много общего с этим. Я пытаюсь создать систему, в которой я могу автоматически добавлять аудируемые поля для нашей базы данных. То, что я пытаюсь сделать, это объединить следующие два выраженияПрисоединение к выражениям Linq

a => new 
{ 
    a.CreatedBy, 
    a.CreatedTime, 
    a.UpdatedBy, 
    a.UpdatedTime 
} 

и

a => new 
{ 
    a.Id, 
    a.Name, 


} 

поэтому результат equivalant к

a => new 
{ 
    a.Id, 
    a.Name, 
    a.CreatedBy, 
    a.CreatedTime, 
    a.UpdatedBy, 
    a.UpdatedTime 
} 

В результате я должен быть Expression < Func < T, объект >>. Я уже ковырялся и пробовал несколько вещей с Expression.Invoke и Expression.And (итак) и не нашел ничего, что работает для меня.

Я не совсем уверен, возможно ли это, но любая помощь будет оценена по достоинству.

+0

EF4 официально выпущен как часть .NET 4.0. –

+0

Я имею в виду функцию ADO.Net CTP4, которая позволяет создавать только код/​​код только ef development – SnyderJK

+0

Вы хотите иметь метод со следующей подписью, верно? 'Expression > ProjectToAuditObject () где T: IAuditable' Где' AuditObject' содержит необходимые свойства ('Id',' Name' и т. Д.). –

ответ

1

Я не думаю, что вы можете просто «слить» два выражения. Но вы можете использовать альтернативный API для создания сопоставлений с EntityMap.

public static class MapBuilder 
{ 
    public static Expression<Func<T, object>> GetMap<T>(Expression<Func<T, object>> func) where T: IAuditable 
    { 
     var body = func.Body as NewExpression; 

     var param = Expression.Parameter(typeof(T), "o"); 

     var propertyAccessExprs = new List<Expression>(); 

     foreach (MemberInfo member in body.Members) 
     { 
      propertyAccessExprs.Add(Expression.Property(param, member.Name)); 
     } 

     var props = typeof(IAuditable).GetProperties(); 

     foreach (PropertyInfo prop in props) 
     { 
      propertyAccessExprs.Add(Expression.Property(param, prop.Name)); 
     } 

     var columnMappins = new List<Expression>(); 

     foreach (var access in propertyAccessExprs) 
     { 
      columnMappins.Add(Expression.Call(typeof(EntityMap).GetMethod("Column", new Type[] {typeof(Object)}), Expression.Convert(access, typeof(Object)))); 
     } 

     var RowExpr = Expression.Call(typeof(EntityMap).GetMethod("Row"), Expression.NewArrayInit(typeof(EntityMapColumn), columnMappins)); 

     var result = Expression.Lambda<Func<T, object>>(RowExpr, param); 

     return result; 
    } 
} 

Использование является

var builder = new ModelBuilder(); 
      builder.Entity<SimpleAuditableObject>() 
       .HasKey(o => o.Id) 
       .MapSingleType(MapBuilder.GetMap<SimpleAuditableObject>(o => new { o.Id, o.Name })); 

Где

public interface IAuditable 
{ 
    int CreatedBy { get; set; } 
    DateTime CreatedTime { get; set; } 
    int UpdatedBy { get; set; } 
    DateTime UpdatedTime { get; set; } 
} 

public class SimpleAuditableObject : IAuditable 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int CreatedBy { get; set; } 
    public DateTime CreatedTime { get; set; } 
    public int UpdatedBy { get; set; } 
    public DateTime UpdatedTime { get; set; } 
} 

НТН.

+0

Это сработало отлично. Я очень ценю это. гений – SnyderJK

+0

Добро пожаловать :) –