我知道这是一个疯狂的问题…但我会给它一个机会:)是否有任何方式建立你的linq/查询,然后以后能够建立更多,然后执行它…例如:
public void Test()
{
var k = TestRepo();
k = k.Where(e => e.SomeColumn == someValue);
rp.DataSource = k.Select(t => t.Id);
rp.DataBind();
}
public IEnumerable<ApplicationEntity> TestRepo()
{
using (var x = new MyEntityContext())
{
return from q in x.MyColumn
select q;
}
}
如果我没弄错的话,这是行不通的:)…但是,如果你首先可以"构建"查询的基础,然后扩展它,然后一旦它最终准备好,实际执行它并获得结果,这不是很好吗?那么,是否有办法像上面的EF或NHibernate的例子那样做呢?还是两者都有?
提前感谢!
技巧是不是来处理MyEntityContext
。例如,您可以在请求的生命周期内缓存它,并在请求结束时将其丢弃。这可能看起来像这样:
public static class ContextFactory
{
private static bool disposeRegistered = false;
public static MyEntityContext GetContext()
{
RegisterDispose();
var instance = (MyEntityContext)HttpContext.Current
.Items["MyEntityContext"];
if (instance == null)
{
instance = new MyEntityContext();
HttpContext.Current.Items["MyEntityContext"] =
instance;
}
return instance;
}
private static void RegisterDispose()
{
if (disposeRegistered)
return;
HttpContext.Current.ApplicationInstance
.EndRequest += (s,e) =>
{
var instance = HttpContext.Current
.Items["MyEntityContext"] as IDisposable;
if (instance != null)
{
instance.Dispose();
}
};
this.disposeRegistered = true;
}
}
TestRepo
方法看起来像这样:
public IQueryable<Employee> TestRepo()
{
var x = ContextFactory.GetContext()
return
from employee in x.Employees
where employee.Salary > 1000
select employee;
}
注意TestRepo
现在如何返回IQueryable
。这允许其他方法更改查询,并且只有当您开始迭代它时,查询才会被发送到数据库。
注意:除了依赖于静态ContextFactory
类,你也可以将MyEntityContext
注入到希望使用它的类型中。你可以使用一种叫做依赖注入的技术来使用它。
我的印象是将工作,如果您的返回类型从TestRepo()
被设置为IQueryable<ApplicationEntity>
。-/好像我以前做过类似的事情。