在C#中的网格中显示LINQ查询结果的问题

时间:2015-06-16 13:22:41

标签: c# linq

我在这里收到了一些关于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[]>。感谢任何帮助我的指针。

2 个答案:

答案 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;