2015-07-30 2 views
0

Я пытаюсь выделить как можно больше андроида из бизнес-логики, чтобы ускорить процесс.Создание запроса LINQ на основе двух списков и массива объектов для параметров тестирования

Пунктирные вокруг кода У меня есть кусок LINQ, который выглядит как этот

var jobItemDoneTest = JobItemsData.GetJobIfDone(wheelpos, theOrder.GetOrderItemStockItemID); 
var jobsDoneList = new JobItemsData(theOrder.OrderData.jobItemsID).JobItemDone; 
var stillToDo = theOrder 
    .OrderItemsData 
    .Where(p => jobsDoneList.All(p2 => p2.orderItemStockItemID != p.orderItemStockItemID)) 
    .Where(t => !t.description.Contains("2hr")) 
    .Where(t => !t.description.Contains("Staff")) 
    .ToList(); 

Другими словами, есть сравнение между двумя списками, чтобы отфильтровать некоторые результаты.

Что я пытаюсь сделать, это удалить экземпляры этого, чтобы создать общий метод в классе бизнес-объектов.

До сих пор я получил это

public List<T> GetWorkStillToDo<T, U>(List<T> orderItems, List<U> jobItems, params object[] searchList1, string searchList2) 
{ 
    var stillToDo = orderItems.Where(p=>jobItems.Add(p2=>p2.orderItemStockItemID != p.orderItemStockItemID); 
} 

Проблема заключается в том, что если я хочу, чтобы произвести поиск по различным свойствам при р => и p2=>, а затем фильтр на котором условия, я получаю потерян и не может придумать способ, чтобы итерацию от п = 1 п в массиве searchList объектов и включить их в LINQ

Является

p2=>searchList[0].ToString() != searchList2 

разрешается в пределах LINQ и как я могу создать часть запроса?

ответ

0

В каких случаях в LINQ есть объект Func<object, bool>, где object может быть общим, если у вас есть четко определенные правила вокруг них. Синтаксис построения - это просто нормальная лямбда. Итак:

Func<object, bool> where = obj => obj.Propery == delta; 

return someEnumOrList.Where(where); 

Обертка этого параметра позволяет вам запрашивать специальные предложения по вашим предметам. Вам может потребоваться предоставить метод расширения, например, WhereAll, который принимает массив объектов Func<> и проверяет их все. Идея для этого будет заключаться в следующем:

public static IEnumerable<T> WhereAll(this IEnumerable<T> enumerable, Func<object, bool>[] clauses) 
{ 
    var result = enumerable; 
    foreach(var c in clauses) 
    { 
     result = result.Where(c); 
    } 
    return result; 
} 
+0

Спасибо - будет ли это просто перед тем, где предложения в конце, или включить условие «Все» в начальное сравнение? – Nodoid

+0

@Nodoid Я не совсем понимаю. Я предполагал, что вы синтезировали свой первый пример в универсальном методе, чтобы вы могли упорядочить свои '.Where'. Таким образом, в моем примере будет только метод «WhereAll». Кроме того, считаете ли вы, что просто клаузули свои предложения в один и тот же «Где»? – Bigsby

+0

Да, я подумал о том, чтобы положить предложения в то же самое место, но по какой-то причине это давало мне большой удар по оригинальному способу, которым я обладал. Не знаю, почему. – Nodoid