Linq选择IN的位置

时间:2014-05-21 16:15:40

标签: c# sql linq lambda

找不到与SELECT * FROM [Source] WHERE [Field] IN [String Array]等效的lambda linq。我需要从包含字符串数组中的邮政编码的数据表中选择所有数据。我想要一个更快的方式,而不是只是迭代每一行比较它们,因为我认为这将是相当低效的(或者我相信它无论如何)。我似乎无法在Google上找到关于如何在数据表上执行lambda LINQ IN查询的充分答案。任何帮助都会很棒!这是我目前的情况:

List<string> lst = dtEtechZipCodeEmailRecipients.AsEnumerable()
                .Select(o => o.Field<string>("Email")).Distinct().ToList();
for (int i = 0; i < lst.Count - 1; ++i)
{
    string email = lst[i].ToString().ToUpper();
    string[] zipCodes = dtEtechZipCodeEmailRecipients.AsEnumerable()
        .Where(zip => (zip.Field<string>("Email") ?? (object)String.Empty).ToString().ToUpper() == email)
        .Select(zip => zip.Field<string>("ZipCode")).ToArray();

    Console.WriteLine(" - " + email);

    dtEtechModelRequests.AsEnumerable().Where(mod => mod.Field<string>("ZipCode").Contains(zipCodes)).Select(mod => mod);
}

这不起作用,除.Contains之外的所有内容确实完全符合我的要求。我离开.Contains试图证明我的观点。

2 个答案:

答案 0 :(得分:2)

你应该做相反的事情 - 检查邮政编码数组是否包含当前的邮政编码:

Where(mod => zipCodes.Contains(mod.Field<string>("ZipCode"))

这与验证当前邮政编码IN数组是否相同。

答案 1 :(得分:0)

简单回答你的问题是,

[Source].Where(el => [String Array].Contains(el.Field<string>("Field"))

如果您需要NOT IN,请按照以下模式

!

前面添加[String Array]
[Source].Where(el => ![String Array].Contains(el.Field<string>("Field"))

替代陈述

[Source].Where(el => [String Array].Contains(el.Field<string>("Field")==false)