如何对数组中的每个条目运行查询

本文关键字:运行 查询 数组 | 更新日期: 2023-09-27 18:32:22

我正在尝试使用 LINQ to SQL 根据数组中的值查询相应的数据,但遇到了问题。我正在阅读这些线程,但不确定它们是否真的是我想要做的,以及它们是否是如何实现它们的:

LINQ 等效于 foreach for IEnumerable

Linq 风格"For Each"

有我的字符串数组'lines[]',如何为每个条目运行以下查询,并以允许我以连贯的方式输出它们的方式存储结果。同样,这是我的数组示例:例:Z1234Z2345ZAF38383

//some non working code
List<string> results = new List<string>();
var thisQuery = from c in myContext.SpecificTable
where c.itemNumber == (foreach (string i in lines))
select c;
foreach (var result in thisQuery)
{
    results.Add(result);
}
列表

创建很好,我认为写入列表也可以,但是我不知道如何对数组中的每个项目运行查询?

我的数组中的每个条目都以 Z 开头,然后如果重要,将包含字母数字字符的任何排列。示例:Z3333

数组中的每个条目对应于我的数据库"SpecificTable"中表中的一个条目。我想在该表中返回与此值相关的所有内容,以便我可以输出该数据的细节。

例:我想从查询 Z1234 开始,当在"SpecificTable"中找到 Z1234 时,我希望能够输出如下的各种详细信息:

foreach (var res in thisQuery)
{
   //each result from the query (total of 3 from the example) will now show their Description in a messagebox.
   MessageBox.Show("Description:" + res.Description.ToString());
 }

通过使用循环,我希望能够基于初始数组创建所有结果的列表,并输出它们相应的各种值,例如"描述"。

如果这仍然不够信息,请让我知道我可以提供什么以更清楚。

如何对数组中的每个条目运行查询

尝试:

这将循环 myContext.SpecificTable 中的行,并创建一个内部循环来检查行内是否存在匹配项。

var thisQuery = from c in myContext.SpecificTable
                from i in lines
                where c.itemNumber == i
                select c;

或者这个:

这将做同样的事情,只有第二个"迭代器"在包含中完成。

var thisQuery = from c in myContext.SpecificTable
                where  lines.Contains(c.itemNumber)
                select c;

我认为最好将数据库查询放在外循环中,因为您不希望行中的每个项目都有一个"tablecan"。

因此,它将只做一个"tablecan",并尝试在行中找到匹配项。

我认为如果您尝试这样的事情,它会加快速度:

var linesHashSet = new HashSet<string>(lines);
var thisQuery = from c in myContext.SpecificTable
                where  linesHashSet.Contains(c.itemNumber)
                select c;

在这里,它将在第二次迭代中使用哈希集(索引列表)


更新:

客户端可以迭代行,如下所示:

var thisQuery = from c in myContext.SpecificTable.ToArray()
                where  lines.Contains(c.itemNumber)
                select c;

但这会产生性能问题。我建议你试试中间的。

不确定我是否正确理解了您的问题,但您想将 SpecificTable 中的条目与"lines"数组连接起来,并将结果输出为列表?

var results = myContext.SpecificTable.Select(c => lines.Contains(c.ItemNumber)).ToList();
foreach(var result in results)
{
    Console.WriteLine(string.format("{0}:{1}", "Description", result.Description));
}

如果只需要特定属性,则可以返回匿名对象列表。

var results = myContext.SpecificTable.Where(c => lines.Contains(c.ItemNumber)).Select(c => new {c.ItemNumber, c.Description}).ToList();
foreach(var result in results)
{
    Console.WriteLine(string.format("{0}:{1}", "Description", result.Description));
}