我试图在我的应用程序中创建一些过滤,用户将根据该单元格值单击单元格和过滤表…到目前为止我有这个
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
。
我认为你需要把你的代码看清楚。
这一行是什么
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
)
尝试使用这个::
var ds = dbEntities.tbl_weblog.Where(m => n == s).ToList();
dataGridView1.DataSource = ds;
你可以使用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();
注意:在这种情况下,不要将value转换为字符串。如果你有整数值,那么你应该把它作为整数值传递。