2016-12-22 1 views
1

У меня есть DataTable в главном контроллере следующим образом:Как сделать, фильтрование операции вручную Комплекс DataTable

public DataTable GetTable() 
{ 
    DataTable table = new DataTable(); 
    table.Columns.Add("Dosage", typeof(int)); 
    table.Columns.Add("Drug", typeof(string)); 
    table.Columns.Add("Patient", typeof(Info)); 
    table.Columns.Add("Date", typeof(DateTime)); 

    table.Rows.Add(25, "Indocin", new Info("India"), DateTime.Now); 
    table.Rows.Add(50, "Enebrel", new Info("UK"), DateTime.Now); 
    table.Rows.Add(10, "Hydralazine", new Info("Bhutan"), DateTime.Now); 
    table.Rows.Add(21, "Combivent", new Info("India"), DateTime.Now); 
    table.Rows.Add(100, "Dilantin", new Info("GreenLand"), DateTime.Now); 
    return table; 
} 

Информационного класс следующего

public class Info 
{ 
    public string Address { get; set; } 
    public Info(string Add) { 
     this.Address = Add; 
    } 
} 

Теперь я хочу сделать операцию фильтрации основанный на поле адреса, т.е. Patient.Address

Здесь пациент находится объект класса Info

Я принес информацию о каждых колонках следующим образом я определил функциональные возможности в методе «DataTableExtensions.DataTableSerialize (данные)»

DataTableExtensions.DataTableSerialize(data) 
Count = 4 
    [0]: {[Dosage, System.Nullable`1[System.Int32]]} 
    [1]: {[Drug, System.String]} 
    [2]: {[Patient, MvcApplication66.Controllers.HomeController+Info]} 
    [3]: {[Date, System.Nullable`1[System.DateTime]]} 

Но, мне нужно фильтровать DataTable на основе Patient.Address

Я получил ошибку в следующей строке.

DataTableExtensions.DataTableSerialize(data)[ColumnName] 

Необработанное исключение типа 'System.Collections.Generic.KeyNotFoundException' произошло в mscorlib.dll

Дополнительная информация: Данный ключ не присутствовал в словаре.

Где я совершаю ошибку.

Возможно ли выполнить операцию фильтрации в таблице сложных данных.

ответ

0

Вы можете фильтровать DataTable с помощью Linq

//fill the datatable 
DataTable dt = GetTable(); 

//filter the datatable with Linq 
var filteredRows = dt.AsEnumerable().Where(x => x.Field<Info>("Patient").Address == "India"); 

//check if there are any rows before calling CopyToDataTable, 
//otherwise you'll get a "The source contains no DataRows" error 
if (filteredRows.Any()) 
{ 
    DataTable dtFiltered = filteredRows.CopyToDataTable(); 
} 

Если вы 100% уверены, что отфильтрованная таблица будет содержать строки, вы можете вызвать CopyToDataTable() непосредственно.

DataTable dtFiltered = dt.AsEnumerable().Where(x => x.Field<Info>("Patient").Address == "Bhutan").CopyToDataTable(); 

Но я рекомендую вам включатель из DataTable в списки, это будет легче в будущем, когда Info становится более сложной.

List<Drugs> patients = new List<Drugs>(); 

public class Drugs 
{ 
    public int Dosage { get; set; } 
    public string Drug { get; set; } 
    public Info Patient { get; set; } 
    public DateTime Date { get; set; } 
} 
+0

Привет VDWWD, Да, я использовал Linq для извлечения данных, но я хочу, чтобы сформировать предикат для сценариев, Вместо того чтобы писать непосредственно в условии «Где». Я хочу создать условие с помощью метода Express.call. Не могли бы вы рассказать мне, как это сделать? – Kalai

+0

Извините, что я не знаю. – VDWWD

1

Сложная таблица данных может быть отфильтрована, и я сформировал предикат для этого требования.

var memberNames = memberPath.Split('.'); 
Expression value = Expression.Call(
    typeof(DataRowExtensions), "Field", new Type[] { columnType }, 
    source, Expression.Constant(memberNames[0])); 
for (int i = 1; i < memberNames.Length; i++) 
    value = Expression.PropertyOrField(value, memberNames[i]); 
return value; 

Наконец предикат формируется как ехр = {(DataRow.Field ("Пациент"). Address.ToLower() == "Индия")}

так, строка запроса будет как данных = {System.Data.EnumerableRowCollection`1 [System.Data.DataRow] .Where (DataRow => (DataRow.Field («Пациент»). Address.ToLower() == "india"))}

, я могу получить данные.

Для получения более подробной информации: Пожалуйста, обратитесь к ссылке ниже

How to create (predicate) for fetching data from DataTable using Express.call method

Смежные вопросы