将条件(字符串)添加到实体 LINQ 查询



这就是我将linq与我的实体一起使用的方式。我想做的只是能够动态地添加条件。我有字符串条件。例如notes == 'some words'DokumentID == 4 。我很想以某种方式将其用作 linQ 中的条件。我可以提供数据库中的列名称和在两个不同的字符串中搜索的值。但我仍然不知道如何将其添加到我的 linq 中。这是我的程序代码:

        ListImport.Clear();
        using (var db = new Minorlex_MPIPSEntities())
        {
            var query = from s in db.tbl_Dokumenty
                        where s.IdDokumentu == 15
                        select s;
            foreach (tbl_Dokumenty Dokument in query)
            {
                ListImport.Add(Dokument);
            }
        }

我想尝试是否可以获取变量字符串并像这里的状态一样使用它。在字符串中使用变量并将其提供给 linq 并向其添加条件。

query.Where(x => x.status < 0);

您可以使用动态 LINQ 执行此操作。

只需Install-Package System.Linq.Dynamic ,包括 System.Linq.Dynamic 命名空间,您将拥有采用字符串并分析它们的 LINQ 方法版本(Where、OrderBy 等)。

对于动态条件,您可以在代码中使用以下更改

   ListImport.Clear();
    using (var db = new Minorlex_MPIPSEntities())
    {
        var query = from s in db.tbl_Dokumenty
                    where s.IdDokumentu == 15 || s.DynamicCondition
                    select s;
        foreach (tbl_Dokumenty Dokument in query)
        {
            ListImport.Add(Dokument);
        }
    }

如果你需要更多的控制,这就是我刚刚想出的:

private IList<TEntity> Condition<TEntity, TProperty>(Expression<Func<TEntity, TProperty>> propertySelector, TProperty propertyValue)
        where TEntity :class 
    {
        PropertyInfo property = (PropertyInfo)((MemberExpression)propertySelector.Body).Member;
        ParameterExpression typeParameter = Expression.Parameter(typeof(TEntity));
        MemberExpression propertyExpression = Expression.Property(typeParameter, property);
        using (Minorlex_MPIPSEntities entities = new Minorlex_MPIPSEntities())
        {
            BinaryExpression criteriaExpression = 
                Expression.Equal(propertyExpression, Expression.Constant(propertyValue));
            Expression<Func<TEntity, bool>> condition = 
                Expression.Lambda<Func<TEntity, bool>>(criteriaExpression, typeParameter);
            IEnumerable<TEntity> query = entities.Set<TEntity>().Where(condition);
            return query.ToList();
        }
    }

只需传递属性选择器表达式和值即可。您可以使用自定义操作集扩展该方法(现在有简单的相等,请参阅criteriaExpression

最新更新