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

时间:2013-09-20 22:54:12

标签: c# sql arrays linq loops

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

LINQ equivalent of foreach for IEnumerable<T>

Linq style "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());
 }

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

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

2 个答案:

答案 0 :(得分:1)

尝试:

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

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

或者这个:

这样做也是如此,只有第二个'迭代器'在contains中完成。

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

我认为最好将db查询放在outerloop中,因为你不希望行中的每个项目都有'tablescan'。

所以它只会执行'tablescan',并尝试在行中找到匹配。

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

var linesHashSet = new HashSet<string>(lines);

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

这里它将在第二次迭代中使用一个hashset(索引列表)


更新

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

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

但这会产生影响。 我建议你试试中间的。

答案 1 :(得分:1)

不确定我是否正确理解了您的问题,但是您想要使用“lines”数组加入SpecificTable中的条目,并将结果作为列表输出?

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