【问题标题】:Adding condition (string) to Entity LINQ query将条件(字符串)添加到实体 LINQ 查询
【发布时间】:2014-12-09 12:45:10
【问题描述】:

这就是我对我的实体使用 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);

【问题讨论】:

  • 你能把列名和列值分解成单独的操作,还是它们总是作为一个字符串出现?
  • 它们实际上是分开的。列名和值在 2 个不同的字符串中。

标签: c# string linq entity-framework select


【解决方案1】:

您可以使用动态 LINQ 做到这一点。

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

【讨论】:

    【解决方案2】:

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

       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);
            }
        }
    

    【讨论】:

      【解决方案3】:

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

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多