您可以将 Func<EFContext, TResult> 包装在 Entities Context 中以供重用吗?
Can you wrap a Func<EFContext, TResult> inside an Entities Context for reuse?
我对可能可行的重用模式很好奇,想看看是否有其他人尝试过。基本上我有这些例如标准 EF 6.1.3 returns:
private IEnumerable<TypeTran> GetTypes()
{
using (var context = new ExpensesEntities())
{
return context.tdType.Select(x => new TypeTran(x.TypeID, x.Description)).Where(x => x.TypeId != 3);
}
}
private List<Category> GetCurrentCategories()
{
using (var context = new ExpensesEntities())
{
return context.tdCategory.Select(x => new Category(x.CategoryID, x.Description)).ToList();
}
}
不用担心 TypeTran 或 Category。可以说它们只是 POCO,可以是任何东西。它们只是抽象了 EF 的层移除,因此我可以对模型对象产生更多的市场影响,而不会影响数据库中生成的 T4 对象。这个模型工作正常但是有更多的检索模式所以我很好奇我是否可以做类似的事情:
private TReturn RunContextWithOption<TReturn>(Func<ExpensesEntities, TReturn> func)
{
using (var context = new ExpensesEntities())
{
return func.Invoke(context);
}
}
但是当我尝试 运行 它时,我的语法错误,而且我也没有看到在不预先定义上下文的情况下使用上下文的方法。
//Wrong won't run
private List<TypeTran> GetTypes()
{
var cont = new ExpensesEntities();
return RunContextWithOption<List<TypeTran>>((cont) => cont.tdType.Select(x => new TypeTran(x.TypeID, x.Description)).Where(x => x.TypeId != 3));
}
所以它变成了先有鸡还是先有蛋,我希望使用助手自动调用上下文,但我不能,因为我需要它出现在 arg 中。有没有其他人尝试过类似的方法来使他们的回购模式仅减少代码行数?这可能是不好的做法,但我通常会减少代码行并尽可能使用私人助手,而不是无限期地重复使用(var context ...)。
基本上这就是您所需要的。我已经包含了一个可选的 Where
子句,并且包含一个 OrderBy
也很简单:
public IEnumerable<TEntity> GetEntities<TEntity>(
Expression<Func<TEntity, bool>> predicate = null)
where TEntity : class
{
using (var context = new ExpensesEntities())
{
IQueryable<TEntity> data = context.Set<TEntity>();
if (predicate != null)
{
data = data.Where(predicate);
}
return data.ToList();
}
}
并这样称呼它:
var diedOn = DateTime.Now.AddDays(-30);
var zombiesOlderThan30Days = GetEntities<Zombie>(z =>
z.Name == "Bob" && z.DiedOn > diedOn);
var allZombies = GetnEntities<Zombie>();
我对可能可行的重用模式很好奇,想看看是否有其他人尝试过。基本上我有这些例如标准 EF 6.1.3 returns:
private IEnumerable<TypeTran> GetTypes()
{
using (var context = new ExpensesEntities())
{
return context.tdType.Select(x => new TypeTran(x.TypeID, x.Description)).Where(x => x.TypeId != 3);
}
}
private List<Category> GetCurrentCategories()
{
using (var context = new ExpensesEntities())
{
return context.tdCategory.Select(x => new Category(x.CategoryID, x.Description)).ToList();
}
}
不用担心 TypeTran 或 Category。可以说它们只是 POCO,可以是任何东西。它们只是抽象了 EF 的层移除,因此我可以对模型对象产生更多的市场影响,而不会影响数据库中生成的 T4 对象。这个模型工作正常但是有更多的检索模式所以我很好奇我是否可以做类似的事情:
private TReturn RunContextWithOption<TReturn>(Func<ExpensesEntities, TReturn> func)
{
using (var context = new ExpensesEntities())
{
return func.Invoke(context);
}
}
但是当我尝试 运行 它时,我的语法错误,而且我也没有看到在不预先定义上下文的情况下使用上下文的方法。
//Wrong won't run
private List<TypeTran> GetTypes()
{
var cont = new ExpensesEntities();
return RunContextWithOption<List<TypeTran>>((cont) => cont.tdType.Select(x => new TypeTran(x.TypeID, x.Description)).Where(x => x.TypeId != 3));
}
所以它变成了先有鸡还是先有蛋,我希望使用助手自动调用上下文,但我不能,因为我需要它出现在 arg 中。有没有其他人尝试过类似的方法来使他们的回购模式仅减少代码行数?这可能是不好的做法,但我通常会减少代码行并尽可能使用私人助手,而不是无限期地重复使用(var context ...)。
基本上这就是您所需要的。我已经包含了一个可选的 Where
子句,并且包含一个 OrderBy
也很简单:
public IEnumerable<TEntity> GetEntities<TEntity>(
Expression<Func<TEntity, bool>> predicate = null)
where TEntity : class
{
using (var context = new ExpensesEntities())
{
IQueryable<TEntity> data = context.Set<TEntity>();
if (predicate != null)
{
data = data.Where(predicate);
}
return data.ToList();
}
}
并这样称呼它:
var diedOn = DateTime.Now.AddDays(-30);
var zombiesOlderThan30Days = GetEntities<Zombie>(z =>
z.Name == "Bob" && z.DiedOn > diedOn);
var allZombies = GetnEntities<Zombie>();