1

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

用于 IEnumerable<T> 的 foreach 的 LINQ 等效项

Linq 风格“For Each”

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

//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());
 }

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

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

4

2 回答 2

1

尝试:

这将循环 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;

我认为最好将 db 查询放在外循环中,因为您不希望行中的每个项目都有一个“tablescan”。

所以它只会做一个“tablescan”,并尝试在行中找到匹配项。

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

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;

但这会对性能产生影响。建议你试试中间那个。

于 2013-09-20T22:56:42.673 回答
1

不确定我是否正确理解了您的问题,但您想将 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));
}
于 2013-09-23T15:42:17.463 回答