我正在尝试使用LINQ to SQL根据我的数组中的值查询相应的数据,但是我遇到了问题。我正在阅读这些主题,但我不确定它们是否真的是我想要做的,如果它们是如何实现它们的话:
LINQ equivalent of foreach for IEnumerable<T>
我有我的数组字符串'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());
}
通过使用循环,我希望能够根据初始数组创建所有结果的列表,并输出相应的各种值,例如“描述”。
如果仍然没有足够的信息,请让我知道我能提供什么以便更清楚。
答案 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));
}