基于两个列表和对象数组创建LINQ查询以测试参数

时间:2015-07-30 13:48:34

标签: c# linq

我试图尽可能地将业务逻辑中的android分离出来,以加快速度。

在代码周围点缀我有一段看起来像这样的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);
}

问题在于,如果我想搜索p =&gt;的不同属性和p2=>,然后筛选where条件,我迷路了,无法想到在searchList对象数组中从n = 1迭代到n的方法并将它们包含在LINQ中

p2=>searchList[0].ToString() != searchList2
LINQ中允许

,如何创建查询的Where部分?

1 个答案:

答案 0 :(得分:0)

LINQ中的子句是Func<object, bool>对象,如果您有明确定义的规则,则object可以是通用的。构造语法只是一个普通的lambda。所以:

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;
}