使用公共linq表达式避免实体复制到poco

使用公共linq表达式避免实体复制到poco,linq,linq-to-entities,Linq,Linq To Entities,如何避免重复用于将数据库实体映射到poco对象的代码 鉴于此代码: private IQueryable<DummyExtended> Find() { return (from dt in Entities.dummy_table select new DummyExtended { Description = dt.table_1.tabl

如何避免重复用于将数据库实体映射到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();

}

因此,您有一个
dummy_table
,它是一个可枚举或可查询的对象序列。假设序列包含类
DummyTableElement
的对象

您展示了,如果您有一个
DummyTableElement
,那么您知道如何将其转换为
Dummy
对象。您希望重用此函数来创建其他对象,如
DummyExtended
dummyelsoextended
。如果希望类似于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
转换为
DummyExtended
dummyealsoextended
。它们将是一行

在同一扩展类中:

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(),
    };
}
一旦获得了这些,就可以创建扩展函数来转换
TableElements
的任何
IQueryable

public static IQueryable<DummyExtended> ToDummyExtended(
    this IQueryable<TableElement> tableElements)
{
    return tableElements
        .Select(tableElement => tableelement.ToDummyExtended();
}
我不知道你为什么要在这里使用表达式。似乎
dummeyextended
DummyAlsoExtended
并不十分相似,只是它们都有一个属性
Dummy

参数化find函数的目标的一个原因可能是,您希望在find函数中创建匿名类

同样,一旦您创建了
ToDummy
,这将是一个单行程序:

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

但是,在LINQtoEntities表达式树中不支持自定义(扩展)方法。我认为您需要查看LINQKit和
.AsExpandable()
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(),
    };
}
public static IQueryable<DummyExtended> ToDummyExtended(
    this IQueryable<TableElement> tableElements)
{
    return tableElements
        .Select(tableElement => tableelement.ToDummyExtended();
}
private IQueryable<DummyExtended> Find()
{
    return dummy_table.ToDummyExtended();
}

private IQueryable<DummyAlsoExtended> FindAnother()
{
    return dummy_table.ToDummyAlsoExtended();
}
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(),
   });