2013-04-18 5 views
1

Для краткости, предположим, у меня есть модель под названием Участники, какКак запросить на основе свойств модели?

public class Participant() 
{ 
    public int? ID {get; set;} 
    public string Name {get; set;} 
    public DateTime JoinDate {get; set;} 
    public string Address1 {get; set;} 
    public string City {get; set;} 
    public string County {get; set;} 
} 

public IList<Participant> SearchParticipants(Participant objParticipant) 
{ 
    using (Db.Context()) 
    { 
     //HOW CAN I ACHEIVE THIS? USING EF 
     //WARNING PSEUDO-CODE/MAGIC FUNCTION (SearchMatches) BELOW 

     return Db.Entities<Participant>().SearchMatches(objParticipant); 
    } 
} 

В принципе, я не хочу, чтобы построить множественные .where(k => k.PropertyName) запросы. Я думаю, что некоторые фреймворки PHP MVC имеют это, передают объект с определенными свойствами, заполненными и получают массив (в нашем случае IList) для сопоставления результатов из БД.

+0

Вы бы не нужны несколько запросов .гда, только один, в котором вы укажите, какие свойства вам нужно сопоставить, например. Где (k => k.Prop1 == given.Prop1 && k.Prop2 == given.Prop2 ..). Вы также можете поместить это в делегат и отправить его как параметр. –

+0

Вероятно, комбинация отражения и динамического linq. Вы пропустили бы свойства вашего объекта, которые не были бы нулевыми (или некоторое значение «игнорировать»), постоянно добавляя, где клаузулы используют динамический linq. –

+0

Как вы собираетесь указывать, какие поля игнорировать и какие использовать, поскольку у вас есть поля, не содержащие значения NULL? –

ответ

0

Вы можете сделать это, используя комбинацию отражения, чтобы прокрутить ваши свойства, и dynamic linq, чтобы построить предикаты.

Ниже приведен простой пример отправной точки/доказательства концепции.

В настоящее время он использует null как значение, указывающее, что мы не хотим, где положение, но если у вас есть свойство типа значения (например, int), то вы можете добавить атрибут как [FilterIgnore] или что-то и проверить, что, когда вы цикл через свойства.

Сделать новое консольное приложение и заменить Program.cs с этим затем добавить динамический файл Linq от образца к проекту:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Linq.Dynamic; 

class MyObject 
{ 
    // Some properties 
    public string PropertyA { get; set; } 
    public string PropertyB { get; set; } 
    public DateTime? PropertyC { get; set; } 

    static void Main(string[] args) 
    { 
     // Our repository 
     var list = new List<MyObject>() { 
       new MyObject() { PropertyA = "test"} , 
       new MyObject() { PropertyB = "test"} , 
       new MyObject() { PropertyC = DateTime.Today} , 
       new MyObject() { PropertyC = DateTime.Today, 
           PropertyA = "test"} 
      }; 

     // Loop through the filtered results 
     // (calling our GetByExample method with a 
     // new object with a property set) 
     foreach (var obj in 
       GetByExample(list, 
           new MyObject() { PropertyC = DateTime.Today })) 
     { 
      // Write some output so we can see it working 
      Console.WriteLine("Found object"); 
      Console.WriteLine(obj.PropertyA); 
      Console.WriteLine(obj.PropertyB); 
      Console.WriteLine(obj.PropertyC); 
     } 

     // Wait for the user to press a key before we close 
     Console.ReadKey(); 
    } 

    static IQueryable<MyObject> GetByExample(List<MyObject> objects, 
              MyObject filterObj) 
    { 
     // Create our query variable that we'll add to 
     var filteredObjects = objects.AsQueryable(); 

     // Loop through each property on this object 
     foreach (var prop in filterObj.GetType().GetProperties()) 
     { 
      // Get the value of this property 
      var propVal = prop.GetValue(filterObj, null); 

      if (propVal != null) 
      { 
       // If the property isn't null add a where clause 
       filteredObjects = 
        filteredObjects.Where(string.Format("{0} = @0", 
                 prop.Name), 
              propVal); 
      } 
     } 

     return filteredObjects; 
    } 
} 
+0

Ошибка компиляции в 'filterObjects = filterObjects.Where (string.Format (" {0} = @ 0 ", prop.Name), propVal);' и не может понять, как ее исправить –

+0

Убедитесь, что вы загружаете и добавляете динамический linq к вашему проекту. –

+0

Спасибо, Джордж! Динамический Linq наверняка кажется игровым сменщиком здесь. Жаль, что это не было встроено в E.F 5.0 (или это было?) –

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