如何使用Entity FrameWork ToLookUp()

时间:2015-08-10 16:53:56

标签: c# entity-framework

我对网格的ItemSource的当前查询速度非常慢。它目前有8个包含。我已经读过,如果我使用多个查询而不是使用Includes(),它可以加快速度。引自http://mikee.se/Archive.aspx/Details/entity_framework_pitfalls,_include_20140101

我将查询写入我的数据库

var loans = unitOfWork.Context.Loans.AsNoTracking().ToList();
var clientAccount = unitOfWork.Context.ClientAccounts.AsNoTracking().ToList();
var business = unitOfWork.Context.Businesses.AsNoTracking().ToList();

我正在尝试编写下一个ToLookUp部分,但我不太清楚正确的语法/方法是什么。

Loan.cs模型

public int? Client_Id { get; set; }
[ForeignKey("Client_Id")]
public virtual Business Client { get; set; }

public int? ClientAccount_Id { get; set; }
[ForeignKey("ClientAccount_Id")]
public virtual ClientAccount ClientAccount { get; set; }

Business.cs Model

 public virtual ICollection<Loan> Loans { get; set; }

如果它具有1对1的关系,我能够实现查找代码。例如,贷款只能有1个客户帐户。

var clientAccount = unitOfWork.Context.ClientAccounts.AsNoTracking().ToLookup(x => x.LoanId)

但如果不是1比1,我不确定如何实现Lookup和Contains。企业可以有多笔贷款。

var business = unitOfWork.Context.Businesses.AsNoTracking().ToLookup(x => x.Loans);

现在如何设置包含?我在下面尝试但是没有用。

loan.Client = business.Contains(loan.Id) 

1 个答案:

答案 0 :(得分:0)

Looup - 是一个数据结构,它有一个键的许多值(如Dictionary&gt;)。 因此,当您编写ToLookup(x =&gt; x.LoanId)时,意味着您通过LoandId对实体进行了分组,并且您期望MANY实体。 所以,你需要这样的东西:

var loans = unitOfWork.Context.Loans.AsNoTracking().ToLookup(o=>o.Client_Id);
var clientAccount = unitOfWork.Context.ClientAccounts.AsNoTracking().ToList();
foreach(var cilent in clientAccount)
{
    client.Loans = loans[Client.ID].ToArray();
}