c# - 之间的Linq性能

标签 c# .net entity-framework linq

我正在使用 Entity Framework,我想知道以下代码之间是否有任何区别。第一个和第二个代码似乎通过 Entidad.Nombre == "Empresa"获取所有项目,最后一个代码似乎只获取 Entidad.Nombre == "Empresa"的项目。我错了吗?什么更好?

var listFields = from b in unitOfWork.PropiedadRepository.Get()
                         where b.Entidad.Nombre == "Empresa"
                         select b;
var listFields2 = unitOfWork.PropiedadRepository.Get().Where(x => x.Entidad.Nombre == "Empresa");
var listFields3 = unitOfWork.PropiedadRepository.Get(x => x.Entidad.Nombre == "Empresa");

这是 GenericRepository 类。所有存储库都继承了它。

public sealed class GenericRepository<TEntity> where TEntity : class
{
    private readonly ConfigurationDbDataContext _context;
    private readonly DbSet<TEntity> _dbSet;

    public GenericRepository(ConfigurationDbDataContext context)
    {
        _context = context;
        _dbSet = context.Set<TEntity>();
    }

    public IEnumerable<TEntity> Get(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
        string includeProperties = "")
    {
        IQueryable<TEntity> query = _dbSet;

        if (filter != null)
        {
            query = query.Where(filter);
        }

        query = includeProperties.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries).Aggregate(query, (current, includeProperty) => current.Include(includeProperty));

        // ReSharper disable once ConvertIfStatementToReturnStatement
        if (orderBy != null)
        {
            return orderBy(query).ToList();
        }
        else
        {
            return query.ToList();
        }
    }

    public TEntity GetById(object id)
    {
        return _dbSet.Find(id);
    }

    public void Insert(TEntity entity)
    {
        _dbSet.Add(entity);
    }

    public void Delete(object id)
    {
        var entityToDelete = _dbSet.Find(id);
        Delete(entityToDelete);
    }

    public void Delete(TEntity entityToDelete)
    {
        if (_context.Entry(entityToDelete).State == EntityState.Detached)
        {
            _dbSet.Attach(entityToDelete);
        }
        _dbSet.Remove(entityToDelete);
    }

    public void Update(TEntity entityToUpdate)
    {
        _dbSet.Attach(entityToUpdate);
        _context.Entry(entityToUpdate).State = EntityState.Modified;
    }
}

最佳答案

你是对的。

在最后一种情况下,where 子句的计算被提供给数据服务器(linq to entities),客户端只接收过滤后的数据。

在其他情况下,客户端接收所有数据然后对其进行过滤(linq to object)。

就是说:我们在谈论什么性能? CPU、网络、客户端、服务器端?

通常,人们更愿意让服务器过滤 实体链接,但这实际上取决于一些参数和目标。

请注意,恕我直言,linq to entities 和 linq to object 之间最令人惊讶的区别:linq to object 区分大小写。对于实体的 linq,它取决于数据库/表/列排序规则。

此外,正如 Kaspars 所提醒的那样,尾随空格的处理是不同的。

关于c# - 之间的Linq性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32762937/

相关文章:

C# : using lambda to GroupBy every collection elements

c# - 从 Xamarin.iOS 中的泛型基类继承时出错

c# - 如何以及何时为 WinForms 控件设置字体

c# - WPF动画并按顺序更改图像的不透明度

c# - .NET String.Format() 在数字的千位添加逗号

entity-framework - 序列化 Entity Framework 问题

c# - EF4 - Context.Entry 不可用于更改实体状态

c# - 我应该使用哪些泛型

c# - DirectoryEntry.Children 和 Dispose

c# - 正则表达式替换大小写不敏感问题