在lambda表达式中使用变量字段名称

时间:2014-03-14 10:57:50

标签: c# linq lambda

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

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,并且在执行过滤器之前我不知道那是什么,并且值参数为{ {1}}。

3 个答案:

答案 0 :(得分:0)

您可以使用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();

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

答案 1 :(得分:0)

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

这一行是什么

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 :(得分:0)

尝试使用此::

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

可能会有所帮助。