【问题标题】:Using variable field name in lambda expression在 lambda 表达式中使用变量字段名
【发布时间】:2014-03-14 10:57:50
【问题描述】:

我正在尝试在我的应用程序中创建一些过滤,用户将在其中单击单元格并根据该单元格值过滤表...到目前为止我有这个

int c = this.dataGridView1.CurrentCell.ColumnIndex;
int r = this.dataGridView1.CurrentCell.RowIndex;
string s = this.dataGridView1.Rows[r].Cells[c].Value.ToString();
string n = this.dataGridView1.Columns[c].DataPropertyName.ToString();

weblogEntities dbEntities = new weblogEntities();
this.Text = dbEntities.Database.Connection.ConnectionString.ToString();
var ds = dbEntities.tbl_weblog.Where(m => n == s).ToList();
dataGridView1.DataSource = ds; 

但由于 lambda 表达式,我的过滤不起作用。有人可以指出我如何在我的 linq 中实际包含正确的 lambda 吗?

说明: 我想做的是(m=>m.field_name == value),其中m.field_name应该是n,在我执行过滤器之前我不知道那是什么,值参数是s

【问题讨论】:

  • 过滤器应该是什么?如果 n == s 你有它,那么你得到整个表,如果没有,那么你什么也得不到。您要过滤的列是什么?
  • 我认为你需要比较“m”的一些属性。
  • 你能用英文写下你的 where 子句应该是什么吗?因为不清楚你想要达到什么目的

标签: c# linq lambda


【解决方案1】:

我认为您需要清楚地查看您的代码。

这一行是什么

var ds = dbEntities.tbl_weblog.Where(m => n == s).ToList();

正在有效地做是

var b = n == s;
// this line will include all if n==s otherwise include none
var ds = dbEntities.tbl_weblog.Where(m => b).ToList();

您的 lambda 表达式中的 m 变量未被检查。

恐怕没有足够的信息给你更多的提示。您可能需要考虑将变量命名为更易于阅读(例如,columnIndex 而不是 c

【讨论】:

    【解决方案2】:

    尝试使用这个::

    var ds = dbEntities.tbl_weblog.Where(m => n == s).ToList();
    dataGridView1.DataSource = ds; 
    

    这可能会有所帮助。

    【讨论】:

      【解决方案3】:

      你可以使用Dynamic Linq:

      var ds = dbEntities.tbl_weblog.Where(String.Format("{0} = {1}", n, s)).ToList();
      

      另一种方法是构建查询表达式。这是一个扩展方法,它通过名称的某些属性值构建用于过滤源的谓词表达式:

      public static IQueryable<T> Where<T>(this IQueryable<T> source, 
         string propertyName, object value)
      {
          var parameter = Expression.Parameter(typeof(T), "t");
          var property = Expression.PropertyOrField(parameter, propertyName);
          var body = Expression.Equal(property, Expression.Constant(value));
          var expr = Expression.Lambda<Func<T, bool>>(body, parameter);
          return source.Where(expr);
      }
      

      你可以这样使用它:

      var ds = dbEntities.tbl_weblog.Where(n, s).ToList();
      

      注意:在这种情况下,不要将值转换为字符串。如果你有整数值,那么你应该将它作为整数传递。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多