2014-01-17 1 views
1

у меня есть эти данные:EF LINQ запрос, где встретится весь список или массив

class MyTableItem 
{ 
    public long id { get; set; } 
    public long listId { get; set; } 
    public long listFieldValue { get; set; } 
    public long parentId { get; set; } 
} 

и:

var myData = new MyTableItem[] 
     { 
      new MyTableItem { id = 1, listId = 1, listFieldValue = 100, parentId = 1 }, 
      new MyTableItem { id = 2, listId = 2, listFieldValue = 130, parentId = 1 }, 
      new MyTableItem { id = 3, listId = 3, listFieldValue = 170, parentId = 1 }, 
      new MyTableItem { id = 4, listId = 4, listFieldValue = 170, parentId = 1 }, 

      new MyTableItem { id = 5, listId = 1, listFieldValue = 100, parentId = 2 }, 
      new MyTableItem { id = 6, listId = 2, listFieldValue = 130, parentId = 2 }, 
      new MyTableItem { id = 7, listId = 3, listFieldValue = 170, parentId = 2 }, 
      new MyTableItem { id = 8, listId = 4, listFieldValue = 270, parentId = 2 }, 
      ...(continue) 
     }; 

    var myMatchConditions = new int?[][] //id, rangeTypeId(equal, more, less, between), from, to 
     { 
      new int?[] { 1, 1, 100, null }, 
      new int?[] { 2, 2, 125, null }, 
      new int?[] { 3, 3, null, 175 }, 
      new int?[] { 4, 4, 130, 180 } 
      ...(can continue more) 
     }; 

Теперь мне нужно знать, какие MyData (группеПо parrentId) подбираются мои условия,
позвольте мне объяснить подробнее:

Я хочу знать, какой parrent Id имеет listFieldValue где:

1) (listId == 1) & & (listFieldValue == 100)
и
2) (listId == 2) & & (listFieldValue> 125)
и
3) (listId == 3) & & (listFieldValue < 175)
и
4) ((listId == 4) &(listFieldValue> 130) & & (listFieldValue < 180))

он должен вернуть (1) parrentId.

+0

Are вы уверены, что первым условием является '(listId == 1) && (listFieldValue == 100)', а не '(listId == 1) && (listFieldValue> 100)'? – ekad

+0

@ekad да, у меня есть 4 типа диапазона (равный, больше, меньше, между). Позвольте мне добавить в мой вопрос. –

ответ

0

Там вы идете. Объяснения на дне:

IEnumurable<MyTableItem> temp = myData ; 
for (int i = 0; i < myMatchConditions.GetLength(0); i++) 
{ 
    var conditionType = myMatchConditions[i,1]; 
    if (conditionType == 1) 
    { 
     temp = temp.Where(_ => _listFieldValue == myMatchConditions[i,2]); 
    } 
    else 
    { 
     if (conditionType == 2 || conditionType == 4) 
     { 

      temp = temp.Where(_ => _listFieldValue > myMatchConditions[i,2]); 
     } 

     if (conditionType == 3 || conditionType == 4) 
     { 
      temp = temp.Where(_ => _listFieldValue < myMatchConditions[i,3]); 
     } 
    } 
} 
  • Я использую IEnumurable<MyTableItem>, что означает, что это Linq и не Linq субъектам. Я выбрал это потому, что ваш myData не является таблицей EF, а простым массивом.
  • я пройти через все «строки» с for, вы можете сделать это с foreach, и я добавляю Where положения, чтобы отфильтровать все больше и больше каждый раз (Фактическая фильтрация будет происходить только тогда, когда вы используете, что temp список)
  • добавить условие на основе типа во второй ячейке, и если тип 4 ... добавить оба правила 2 и 3 типа ... что делает правило 4 типа
+0

thnks, позвольте мне проверить его. –

+0

перед тем, как начать тест, в rel i use myData - таблица EF. это пример, что-то изменилось? –

+0

@mohammadadibi Да. используйте 'IQueryable' вместо' IEnumerable'. Это означает, что запрос будет генерироваться и отправляться в вашу БД. – i3arnon

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