我在这里收到了一些关于LINQ查询的帮助,但我仍然在努力解决它。我试图获得的结果是从DataGridView控件中的xml文件中显示一些属性及其值。我通过点击按钮调用我的方法,并尝试传回列表以在网格中显示。以下是该行的示例:
<z:row CenterCode="JAX" CenterName="Jacksonville" Version="1.0" NextExport="66742" NextImport="29756" LastImportTime="2015-06-10T14:48:33" FtpProxyServer="" FtpUserName="" FtpPassword="" ResetImportID="False"/>
以下是方法:
public static List<string[]> MonitorCounts(string upperLimit)
{
// Load xml
XDocument xmldoc = XDocument.Load(@"c:\XML\Configuration.xml");
XNamespace z = "#RowsetSchema";
Int32 limit = Convert.ToInt32(upperLimit);
var elementQuery = xmldoc.Descendants(z + "row").Where(e => (long?)e.Attribute("NextExport") > limit | (long?)e.Attribute("NextImport") > limit);
var attributes = elementQuery.Select(e => e.Attributes().Select(a => new KeyValuePair<string, string>(a.Name.LocalName, (string)a)).ToList()).ToList();
return attributes;
}
我的问题是如何只选择属性中的特定属性和值。如果我做这样的事情:
var attributes = elementQuery.Select(e => e.Attributes("CenterName").Select(a => new KeyValuePair<string, string>(a.Name.LocalName, (string)a)).ToList()).ToList();
然后返回:
[0] = {[CenterName, Jacksonville]}
我需要选择此项和其他4项。我也收到了转发错误 - 无法隐式转换类型&#39; System.Collections.Generic.List<System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string,string>>>
&#39;到System.Collections.Generic.List<string[]>
。感谢任何帮助我的指针。
答案 0 :(得分:0)
您可以使用匿名类型:
var attributes =
elementQuery.Select(e => new
{
CenterName = (string)e.Attribute["CenterName"],
Version = (string)e.Attribute["Version"],
// more attributes
}).ToList();
但是,您无法以有用的方式从方法中返回此信息。因此,如果您确实需要属性名称和属性值作为字符串,请尝试使用此方法:
var attributes =
elementQuery.Select(e => new []
{
Tuple.Create("CenterName", (string)e.Attribute["CenterName"]),
Tuple.Create("Version", (string)e.Attribute["Version"]),
// more attributes
}).SelectMany(x => x).ToList();
现在,您的方法的返回类型必须为List<Tuple<string, string>>
。
最后,如果您确实需要List<string[]>
作为返回类型,请使用以下代码:
var attributes =
elementQuery.Select(e => new []
{
new [] { "CenterName", (string)e.Attribute["CenterName"] },
new [] { "Version", (string)e.Attribute["Version"] },
// more attributes
}).SelectMany(x => x).ToList();
答案 1 :(得分:0)
我解决了自己的问题。这是我做的:
为所需属性创建了一个类:
public class dataRow
{
public string CenterName { get; set; }
public string CenterCode { get; set; }
public string NextImport { get; set; }
public string NextExport { get; set; }
public string LastImportTime { get; set; }
}
将结果选入其中:
List<dataRow> dataRows = elementQuery.Select( e => new dataRow
{ CenterName = (string)e.Attribute("CenterName"),
CenterCode = (string)e.Attribute("CenterCode"),
NextImport = (string)e.Attribute("NextImport"),
NextExport = (string)e.Attribute("NextExport"),
LastImportTime = (string)e.Attribute("LastImportTime") }).ToList();
更改了我的方法以返回正确的对象:
public static List<dataRow> MonitorCounts(string upperLimit)
将我的网格数据源设置为方法返回:
dataGridView1.DataSource = xmlProcessing.MonitorCounts(tbxUpperLimit.Text.ToString());
return dataRows;