我试图在我的应用程序中创建一些过滤,用户将根据该单元格值单击单元格和过滤表...到目前为止我有这个
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}}。
答案 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;
可能会有所帮助。