c# - 有没有办法在 DBSet 的查询中包含本地缓存的项目?

标签 c# .net linq entity-framework

我刚刚接触 Entity Framework ,但对 DBSet 对象的某些行为感到有些困惑。当我调用 Find() 方法时,它似乎知道我最近添加(但尚未保存)的项目集合,但是当我尝试查询 DBSet 时,它似乎只包括一直存在的项目.有没有一种简单的方法可以解决这个问题?我包括了一些我已经完成的代码来尝试解决这个问题,但是当它开始遍历我的“已添加”更改集中的项目时,我收到此错误:

"Unable to create a constant value of type EntityType. Only primitive types ('such as Int32, String, and Guid') are supported in this context."

internal DbContext Context  { get; set; }
protected DbSet<T> DBSet    { get; set; }

public virtual IEnumerable<T> Get(
    Expression<Func<T, bool>> filter = null,
    Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
    bool ignoreCachedChanges = false)
{
    IQueryable<T> oReturn = DBSet;

    // This block is intended to adjust the queryable source to account for changes
    if (!ignoreCachedChanges)
    {
        oReturn = oReturn.Except(Context.ChangeTracker.Entries<T>().Where(x => x.State == System.Data.EntityState.Deleted).Select(x => x.Entity));
        oReturn = oReturn.Union(Context.ChangeTracker.Entries<T>().Where(x => x.State == System.Data.EntityState.Added).Select(x => x.Entity));
    }
    if (filter != null)
        oReturn = oReturn.Where(filter);

    if (orderBy != null)
        return orderBy(oReturn).ToList();
    else
        return oReturn.ToList();
}

// NOTE: Get By ID uses Find which considers the queued-but-not-yet-applied changes
public virtual T GetByID(object id)
{
    return DBSet.Find(id);
}

(如果上下文有帮助,我这样做是因为我想设置一个单元测试,在其中我用适合我特定测试环境的项目填充我的(本地)上下文......我会尽快必须应用这些更改,因为它们实际上仅适用于该特定测试,但如果需要我可以......在这样做时,我很惊讶地看到存储库在其查询结果中不包括更改的项目——除非我正在做 FindByID——所以我也希望我可以解决明显的不一致,或者更好地理解为什么这是不可行的……或者不是一个好主意?:) )

最佳答案

异常说明:您不能将实体类型列表(您的通用类型 T)发送到服务器以使用这些集合在 SQL 中执行 ExceptUnion “常量”对象。基本上,您必须使用 LINQ to Objects 在内存中应用 ExceptUnion,这意味着:来自服务器的过滤结果已具体化(因此,在 .ToList() 之后的某处)。您必须再次将过滤器应用于上下文中处于 Added 状态的对象列表。

关于c# - 有没有办法在 DBSet 的查询中包含本地缓存的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7027464/

相关文章:

c# - 有什么方法可以禁用 AutoMapper 的异常包装吗?

c# - 如何在 asp.net/c# 中重现丢失的 session ?

.net - .Net 中的数据库应用程序最佳实践

c# - Linq to sql 表达式树执行区问题

c# - 如何在 C# 中使用 key 大小小于内置最小 256 位的 ECDSA

C# 在注册表本地计算机中创建值

c# - 在运行时更改 CSS 中的值(特别是 .Net)

.net - 如何使用 Android 使用 WCF 服务

c# - 如何将 Action 提取到成员函数中?

c# - 如何从存储过程返回的表中获取列名