Привет Я создаю приложение winform в C#.Как написать общее дерево выражений для данных фильтра в C#
Я использую EF5 для работы с базой данных.
и для привязки данных к моему DataGridViews я создал компонент из BindingSource, который имеет метод Bind(), которые выполняются это событие:
private object bindingSourceTbl1_DataSourceBinding(object sender, EventArgs e)
{
using (SampleDbEntities dbo = new SampleDbEntities())
{
return(from x in dbo.Tbl1
where x.Id == (int)comboBoxPerson.SelectedValue
select x).Take(1000).ToList();
}
}
, потому что моя база данных имеют много больших объемы данных я выборки парциальные данных. и я использую поиск для получения записи соответствия. для этого я создал компонент SearchPanel, который создает текстовые поля для фильтрации каждого столбца в моей сетке.
на теперь я хочу, чтобы отправить дерево выражения в моем случае в качестве параметра, чтобы присоединиться к где положение так: существует
private object bindingSourceTbl1_DataSourceBinding(object sender, EventArgs e,Expression whereClause)
{
using (SampleDbEntities dbo = new SampleDbEntities())
{
return(from x in dbo.Tbl1
where x.Id == (int)comboBoxPerson.SelectedValue && whereClause
select x).Take(1000).ToList();
}
}
но мое выражение метод дерева строитель в моем коде компонента и я не доступ к мой DbContext в моем проекте и просто у меня есть имена полей в моем компоненте, также я хочу написать только один метод для всех таблиц.
это означает, что я не могу вернуться, как
< Expression Func < AnyDbSet, BOOL >>
и я не знаю, как это сделать?
Благодаря
спасибо. Я решил проблему с вашим решением. но все же у меня есть проблема. потому что мне нужно искать данные с вводом значения фильтра. Мне нужно преобразовать свойства в строку, но выражение не поддерживало это. например, ему не удалось преобразовать десятичный или двойной код в строку моего кода: –
var propInfo = this.dataSourceItemsType.GetProperty (fieldsName [i], BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.GetField); Выражение columnExpr = Expression.Property (entityParameter, propInfo); if (propInfo.PropertyType! = Typeof (String)) { columnExpr = Expression.Convert (columnExpr, typeof (String)); } Я искал эту проблему, и я увидел, что эта проблема является ошибкой в деревьях выражений. Можете ли вы помочь мне решить ее? –
@noorashegh Я не думаю, что это ошибка, 'Convert' является эквивалентом кастинга, и вы не можете просто использовать' decimal' для 'string' в C#. Вместо этого вы можете создать выражение, которое вызывает ['SqlFunctions.StringConvert'] (http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.stringconvert). – svick