使用公共linq表达式避免实体复制到poco
如何避免重复用于将数据库实体映射到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
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(),
});