2017-05-16 26 views
0

我该如何避免重复我用于将数据库实体映射到poco对象的代码?使用常见的linq表达式来避免实体重复到poco

鉴于此代码:

private IQueryable<DummyExtended> Find() 
{ 
    return (from dt in Entities.dummy_table 
      select new DummyExtended 
      {       
       Description = dt.table_1.table_2.description,    
       Dummy = new Dummy 
       { 
        Name = d.name, 
        Notes = d.notes, 
        HelpText = d.help_text   
       } 
      }).AsQueryable(); 

} 

我可以创建可重复使用这两种方法的共同LINQ表达?

private IQueryable<DummyExtended> Find() 
{ 
    return (from dt in Entities.dummy_table 
      select new DummyExtended 
      {       
       Description = dt.table_1.table_2.description,    
       Dummy = ...??? 
      }).AsQueryable(); 

} 

private IQueryable<DummyAlsoExtended> FindAnother() 
{ 
    return (from dt in Entities.dummy_table 
      select new DummyAlsoExtended 
      {       
       InnerHtml = dt.table_html.description,    
       Dummy = ....?? 
      }).AsQueryable(); 

} 

例子:

public static Expression<Func<dummy_table, Dummy>> EntityToPoco() 
{ 
    return d => new Dummy 
    { 
     Name = d.name, 
     Notes = d.notes, 
     HelpText = d.help_text 
}; 

}

我不能完全得到它的权利

.... 
Dummy = ExtensionClass.EntityToPoco() 
+0

我认为你需要寻找到LINQKit和'.AsExpandable( )'。 – NetMage

回答

0

所以,你有一个dummy_table是对象的可枚举或可查询序列。我们假设该序列包含DummyTableElement类的对象。

您显示,如果您有DummyTableElement,则知道如何将其转换为Dummy对象。您想重新使用此功能来创建其他对象,如DummyExtendedDummyAlsoExtended。如果你想这样做LINQ的一样,最好为它创建的扩展功能:

static class DummyTableElementExtensions 
{ 
    public static Dummy ToDummy(this TableElement tableElement) 
    { 
     return new Dummy() 
     { 
      Name = tableElement.name, 
      Notes = tableElement.notes, 
      HelpText = tableElement.help_text  
     }; 
    } 
} 

一旦你有了这个,你可以创建类似的功能,以TableElements转化为DummyExtendedDummyAlsoExtended。他们将是单线。

在同一个扩展类:

public static DummyExtended ToDummyExtended(this TableElement tableElement) 
{ 
    return new DummyExtended() 
    { 
     Description = tableElement.table_1.table_2.description, 
     Dummy = tableElement.ToDummy(),    
    }; 
} 
public static DummyAlsoExtended ToDummyAlsoExtended(this TableElement tableElement) 
{ 
    return new DummyAlsoExtended 
    {       
     InnerHtml = tableElement.table_html.description,    
     Dummy = tableElement.ToDummy(), 
    }; 
} 

而且一旦你得到这些,你可以创建扩展功能转换任何IQueryableTableElements的:

public static IQueryable<DummyExtended> ToDummyExtended(
    this IQueryable<TableElement> tableElements) 
{ 
    return tableElements 
     .Select(tableElement => tableelement.ToDummyExtended(); 
} 

,用一个类似线功能DummyAlsoExtended

Find功能和FindAnother功能也将是一个俏皮话:

private IQueryable<DummyExtended> Find() 
{ 
    return dummy_table.ToDummyExtended(); 
} 

private IQueryable<DummyAlsoExtended> FindAnother() 
{ 
    return dummy_table.ToDummyAlsoExtended(); 
} 

我不知道你为什么想在此使用的表达式。似乎DummyExtendedDummyAlsoExtended是非常相似的,只是它们都有一个属性Dummy

参数化查找函数的目的地的一个原因可能是因为您想要在查找函数中创建匿名类。

再次,一旦你创建ToDummy这将是一个班轮:

public static IQueryable<TResult> Find<TSource, TResult>(
    this IQueryable<TSource> source, 
    Expression<Func<TSource, TResult>> resultSelector) 
{ 
    return source.Select(sourceElement => resultSelector(sourceElement); 
} 

用法是:

var X = dummy_Table.find(tableElement => new 
    { 
     foo = tableElement.CalculateFoo(), 
     bar = tableElement.CalculateBar(), 
     Dummy = tableElement.ToDummy(), 
    }); 
+0

虽然在LINQ to Entities表达式树中不支持自定义(扩展)方法。 –