LINQ查询使用包含搜索值的数组

时间:2014-08-13 21:36:01

标签: c# linq entity-framework

这基本上是一个如何从表格中匹配搜索值数组的表中获取值数组的问题。

如果我有数组internalCustomers []:

1001
1003

然后我有一个名为WinFlexCustomer的实体框架建模的表:

Customer, TaxID
1000, "CBA"
1001, "RCS"
1002, "Weekly ACH"
1003, "Daily ACH"

如何设计LINQ查询以返回包含与internalCustomers数组匹配的TaxID值的数组?我希望每个数组的索引都匹配,所以我可以处理每个数组并使它们同步。

我认为这样的事情可行,但我遇到语法错误。

var query = from c
            in context.WinflexCustomers
            where c.InternalClientNum.Contains(customer.ToList())
            select c.TaxID2

2 个答案:

答案 0 :(得分:2)

如果我理解正确的话,您正在寻找与T-SQL的IN语法相同的语法:

var ret = db.WinFlexCustomer
            .Where(c => !internalCustomers.Contains(c.Customer))
            .Select(c => c.TaxID)
            .ToArray();

或多或少映射到:

SELECT TaxID
FROM WinFlexCustomer
WHERE Customer IN (1001, 1003)

我并不完全确定您所说的内容"希望每个数组的索引都匹配,以便我可以处理每个数据并使它们同步,"因为数据库本质上是无序的(或者至少,我们意味着以这种方式对待它们)但是如果你这样做的话索引并不重要。

修改

这可能是做你想做的更好的方法:

var ret = db.WinFlexCustomer
            .Where(c => !internalCustomers.Contains(c.Customer))
            .ToArray();

然后,您可以评估每个项目以查找其TaxID Customer,因此您无需对其进行映射另一个数组通过索引。

答案 1 :(得分:1)

不是并排处理数组并依赖它们的索引同步,而是允许数据库返回ID以及名称:

var customerIds = new[]{1001, 1003};
var query = 
        from c in context.WinflexCustomers
        where customerIds.Contains(c.InternalClientNum)
        select new { c.InternalClientNum, c.TaxID2 }
foreach(var customer in query)
{
    var clientNumber = customer.InternalClientNum;
    var taxId = c.TaxID2;
    // do stuff...
}