2016-11-15 2 views
1

У меня есть список свойствфильтра в Linq C# с динамическими свойствами

string[] strings = 
{ 
    "State", "Name","Location" 
}; 

Они все в тестовом объекте с типом строкой, мне нужно, чтобы петля бросить их первыми и фильтровать данные, когда свойство равно «OK "

Вот мой фрагмент кода

for (int x=0;x<strings.Length;x++) 
{ 
    // PropertyDescriptor prop = TypeDescriptor.GetProperties(typeof(Test)).Find(strings[x],true);            

    var miss = _unityOfWork.TestRepository.Get(i => 
        i.GetType().GetProperty(strings[x]).Equals("OK")) 
        .Select().toList() 

этот код возвращает следующее исключение:

«LINQ to Entities не распознает метод« System.Reflection.PropertyInfo GetRuntimeProperty (System.Type, System.String) », и этот метод не может быть переведен в выражение хранилища».

Мне нужно отфильтровать список с именем свойства формируют массив

+0

Что именно ваш TestRepository? Как это реализовано? –

+0

Я думаю, вы хотели сказать _ когда свойство ** значение ** равно «ОК» _, правильно? – wdosanjos

+0

@EduardMalakhov наследуется от GenericRepository – abdoutelb

ответ

1

Вот как я, вероятно, сделаю это ... простой и простой, без отражения, а переключатель имеет две функции: (1) защитить от неизвестных полей, (2) применить надлежащее условие для каждого случая.

var strings = new[] { "State", "Name", "Location" }; 

var result = _unityOfWork.TestRepository.GetAll().AsQueryable(); 
// you may need to tweak the above before it works 

foreach (var field in strings) 
{ 
    switch (field) 
    { 
     case "State": 
      result = result.Where(x => x.State == "OK"); 
      break; 
     case "Name": 
      result = result.Where(x => x.Name == "OK"); 
      break; 
     case "Location": 
      result = result.Where(x => x.Location == "OK"); 
      break; 
    } 
} 

return result; // if needed, add .ToList() or .ToArray() 
+0

спасибо, это помогло – abdoutelb

-1

Вы можете сделать это (не уверен относительно точного синтаксиса, но идея):

var miss = _unityOfWork.TestRepository.Get() 

        .Where(i => i.GetType().GetProperty(strings[x]).Equals("OK")) 
        .toList() 

EDIT: правильный вариант будет что-то вроде

var miss = _unityOfWork.TestRepository 
       .ToList() 
       .Where(i => i.GetType().GetProperty(strings[x]).Equals("OK")) 
       .toList() 
+0

Спасибо ...но он все тот же – abdoutelb

+0

@AbdouTelb извините, я потерял вызов ToList посередине. –

0

Y НУ потенциально может сделать следующее:

public string ValidateProperty<T>(T parameter) 
{ 
    var properties = typeof(...).GetProperties(); 
    foreach(var property in properties) 
      if(property == parameter) 
       return "OK"; 

    return "FAIL"; 
} 

var content = collection.Get().Where(property => ValidateProperty(property.Name.Value) == "OK" && ValidateProperty(property.State.Value) == "OK"); 

Не было времени, чтобы проверить синтаксис, но это позволит вам сравнить все. Ловушка, это будет генерировать массив PropertyInfo каждый звонок. Идея или другой подход, не уверен, насколько это возможно для вашей реализации.

0

Поскольку OP показал, что свойства всегда одинаковы, пожалуйста, попробуйте следующее:

var miss = _unitOfWork.TestRepository 
         .Where(m => m.State == "OK" || m.Name == "OK" || m.Location == "OK"); 
+0

Мне нужна строка за тест на допустимое свойство – abdoutelb

+0

Изменено '&&' by '||' для удовлетворения вашего требования к тестированию. – wdosanjos

+0

все еще имеет проблемы, когда проекция не может попасть туда, где именно происходит условие – abdoutelb