我知道这是一个疯狂的问题..但是我试试看:) 反正有没有建立你的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 ..或两者都是em?
提前致谢!
答案 0 :(得分:2)
诀窍是不来处置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
类。您可以使用称为依赖注入的技术来使用它。
答案 1 :(得分:0)
我认为将工作,如果,则TestRepo()
的返回类型设置为IQueryable<ApplicationEntity>
。我希望它能证明: - /似乎我以前做过类似的事情。