virtual bool hasVoted来自虚拟Votes属性

时间:2014-01-30 23:19:53

标签: performance entity-framework ef-code-first

我不知道应该怎么做,但我知道自己想做什么。

我有一个模特

Item
     Id:Guid (PK)
     Title:string
     Votes:virtual ICollection<Vote>

     function bool hasVoted(string UserId){ return VotesContainsUserId.Count() == 1;}

Vote
     Id:Guid (PK)
     UserId:string (FK)
     ItemId:Guid (FK)

当我当前查询投票时,我将一个属性添加到我的代码优先模型hasVoted,这是一个带有参数的非映射函数:UserId。

为此,必须加载所有投票,当呈现视图时,它会通过循环所有获取的值来检查用户是否有投票。

我想减少查询负载,我只能通过加载“hasVoted”函数来完成,而不用.Include(“Votes”)函数加载所有投票。

有没有办法做到这一点或其他方式来减少我的查询负载?

PS。为了学习关于lambda的东西,我对编写SQL查询不感兴趣。

1 个答案:

答案 0 :(得分:0)

public bool hasVoted(string userId) { 
    return this.Votes.Any(vote => vote.UserId == userId);
}

此查询测试是否有来自特定用户的投票,但它对您没有帮助。当您访问Votes集合时,将自动加载所有项目,并在内存中执行查询。

如果您不想将投票加载到内存中,则需要使用DbContext类来运行查询。

public bool hasVoted(string userId, DbContext ctx) {
    return ctx.Entry<Item>(this)
        .Collection(o => o.Votes)
        .Query()
        .Any(vote => vote.UserID == userId);
}