[英]How To Process Entity Framework Context int Lambda Expression
我使用ef 6.13獲取一些數據,並將新的類數據返回到我的應用程序。
public List<v_apply_detail2> GetApplyList()
{
using (yoyoEntities ds = new yoyoEntities())
{
return datas = ds.v_apply_detail.Select(p => new v_apply_detail2 { apply_id = p.apply_id, time_line = ds.yoyo_apply_timeline.ToList() }).ToList();
}
}
運行正常。
我想在New Func中移動Select方法,並使用dbcontext yoyoEntities(ds)。
Func<v_apply_detail, v_apply_detail2> SelectOutApply(yoyoEntities ds, bool includetimeline = false)
{
return (p => new v_apply_detail2
{
apply_id = p.apply_id,
time_line = includetimeline ? ds.yoyo_apply_timeline.Where(x => x.apply_id == p.apply_id).OrderByDescending(x => x.time).ToList() : null
});
}
public List<v_apply_detail2> GetApplyList()
{
using (yoyoEntities ds = new yoyoEntities())
{
return datas = ds.v_apply_detail.Select(SelectOutApply(ds,true)).ToList();
}
}
當我調用GetApplyList函數時,會收到一個錯誤消息:實體框架:已經有一個與此Connection關聯的打開的DataReader,必須首先關閉它。
如何在Func <>或Expression <>中使用dbcontext? 伙計們!
允許多個活動結果集應解決您所看到的錯誤。
string connectionString = "Data Source=MSSQL1;" +
"Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +
"MultipleActiveResultSets=True";
https://msdn.microsoft.com/zh-CN/library/h32h3abf(v=vs.110).aspx
但是我相信您應該傳遞一個可查詢的而不是dbcontext。
更新:將時間軸屬性設置為Virtual 。
public partial class v_apply_detail2 {
public long apply_id { get; set; }
public long hiring_id { get; set; }
public string hiring_title { get; set; }
public string publish_user_id { get; set; }
public string publish_company_id { get; set; }
public string user_id { get; set; }
public Nullable<System.DateTime> pre_accept_time { get; set; }
public sbyte join_type { get; set; }
public Nullable<decimal> deal_pay { get; set; }
public Nullable<System.DateTime> deal_time { get; set; }
public Nullable<System.DateTime> start_work_time { get; set; }
public Nullable<System.DateTime> finish_time { get; set; }
public string master_appraise { get; set; }
public string worker_appraise { get; set; }
public Nullable<int> master_rating { get; set; }
public Nullable<int> worker_rating { get; set; }
public int status { get; set; }
public Nullable<System.DateTime> master_rating_time { get; set; }
public Nullable<System.DateTime> worker_rating_time { get; set; }
public string hiring_snapshots { get; set; }
public virtual List<yoyo_apply_timeline> time_line { get; set; }
public member_info member_info { get; set; }
public company_info company_info { get; set; }}
然后,不使用上下文,而使用查詢變量:
Func<v_apply_detail, v_apply_detail2> SelectOutApply(yoyoEntities ds, bool includetimeline = false) {
return (p => new v_apply_detail2
{
apply_id = p.apply_id,
time_line = includetimeline ? p.timeline.OrderByDescending(x => x.time) : null
});}
更好的方法(單一方法):為了使事情簡單,下面的方法應該可以正常工作(只是不要再次使用datacontext查詢時間軸):
public List<apply_detail_dto> GetApplyList(){
using (yoyoEntities ds = new yoyoEntities())
{
return datas = ds.v_apply_detail.Select(p => new apply_detail_dto { apply_id = p.apply_id, time_line = p.timeline }).ToList();
}}
並使用DTO對象投影到(new apply_detail_dto {})中。 希望能有所幫助。
這可能對您有幫助
Expression<Func<v_apply_detail, v_apply_detail2>> SelectOutApply(yoyoEntities ds,bool includetimeline = false)
{
if (includetimeline)
return (p) => new v_apply_detail2
{
apply_id = p.apply_id,
time_line = ds.yoyo_apply_timeline.Where(x => x.apply_id == p.apply_id).OrderByDescending(x => x.time).ToList()
};
return (p) => new v_apply_detail2
{
apply_id = p.apply_id
};
}
public List<v_apply_detail2> GetApplyList()
{
using (yoyoEntities ds = new yoyoEntities())
{
return datas = ds.v_apply_detail.Select(ds,SelectOutApply(true)).ToList();
}
}
感謝Amanvir Singh Mundra。
這是我的poco課程
public partial class v_apply_detail2
{
public long apply_id { get; set; }
public long hiring_id { get; set; }
public string hiring_title { get; set; }
public string publish_user_id { get; set; }
public string publish_company_id { get; set; }
public string user_id { get; set; }
public Nullable<System.DateTime> pre_accept_time { get; set; }
public sbyte join_type { get; set; }
public Nullable<decimal> deal_pay { get; set; }
public Nullable<System.DateTime> deal_time { get; set; }
public Nullable<System.DateTime> start_work_time { get; set; }
public Nullable<System.DateTime> finish_time { get; set; }
public string master_appraise { get; set; }
public string worker_appraise { get; set; }
public Nullable<int> master_rating { get; set; }
public Nullable<int> worker_rating { get; set; }
public int status { get; set; }
public Nullable<System.DateTime> master_rating_time { get; set; }
public Nullable<System.DateTime> worker_rating_time { get; set; }
public string hiring_snapshots { get; set; }
public List<yoyo_apply_timeline> time_line { get; set; }
public member_info member_info { get; set; }
public company_info company_info { get; set; }
}
我的項目中有同一個班級提供數據服務
因此,我的問題是查詢性能和代碼重用。
如果我在選擇功能中添加dbcontext,就像這樣
using (yoyoEntities dd = new yoyoEntities())
{
v_apply_detail2 result = new v_apply_detail2();
{
result.apply_id = x.apply_id;
result.time_line = dd.yoyo_apply_timeline.Where(p => p.apply_id == x.apply_id).OrderByDescending(p => p.time).ToList();
}
return result;
}
我可以得到結果,但是會觸發很多sql查詢。 但是使用
return datas = ds.v_apply_detail.Select(p => new v_apply_detail2 { apply_id = p.apply_id, time_line = ds.yoyo_apply_timeline.ToList() }).ToList();
sql查詢僅一個。所以,我想重用ds。我認為表達式可以做到這一點,而我找不到路。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.