簡體   English   中英

如何處理實體框架上下文int Lambda表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM