使用在foreach中创建的变量

时间:2015-05-21 07:52:00

标签: c#

我正在尝试从XML文件和数据库表列中提取重复项

这是我目前的代码

using (AH_ODS_DBEntities db = new AH_ODS_DBEntities())
{
    //XML CustomerRefNbr            
    string[] allFiles = Directory.GetFiles(@"C:\xml\");
    foreach (var @CRN in allFiles)
    {
        XElement xEle = XElement.Load(@CRN);
        IEnumerable<XElement> invoices = xEle.Elements();
        foreach (XElement pEle in invoices)
        {
            string c = pEle.Element("CustomerRef").Value;
        }

        //DB CustomerRefNbr
        IEnumerable<string> rs = db.Sales.AsQueryable().Select(crn => crn.CustomerRefNbr);
        foreach (string invoice in rs)
        {
            string i = invoice;
        }
    }

}

我想要实现的是获取字符串c和i,比较它们是否匹配并将它们放入列表中。

var duplicateCRN= db.Sales.SqlQuery("SELECT  * FROM Sales WHERE " + i + "==" + c)
                            .ToList<Sale>();   

不确定我是否正确行事。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你想检查xml中的任何元素是否包含与数据库中任何条目相同的值吗?

你现在在foreach中所做的事情没有做任何事情,因为你只是覆盖了这些值,但却没有做任何事情。

检查此代码:

using (AH_ODS_DBEntities db = new AH_ODS_DBEntities())
{
    //XML CustomerRefNbr            
    string[] allFiles = Directory.GetFiles(@"C:\xml\");
    foreach (var @CRN in allFiles)
    {
        XElement xEle = XElement.Load(@CRN);
        IEnumerable<XElement> invoices = xEle.Elements();
        foreach (XElement pEle in invoices)
        {
            string c = pEle.Element("CustomerRef").Value;
            //DB CustomerRefNbr
            IEnumerable<string> rs = db.Sales.AsQueryable().Select(crn => crn.CustomerRefNbr);
            foreach (string invoice in rs)
            {
                if (invoice == c);
                    //This is a match
            }
        }
    }
}

您也可以直接使用Linq to SQL执行此操作,这是首选方法(更好的性能)

    //XML CustomerRefNbr            
    string[] allFiles = Directory.GetFiles(@"C:\xml\");
    foreach (var @CRN in allFiles)
    {
        XElement xEle = XElement.Load(@CRN);
        IEnumerable<XElement> invoices = xEle.Elements();
        foreach (XElement pEle in invoices)
        {
            string c = pEle.Element("CustomerRef").Value;
            //DB CustomerRefNbr
            using (AH_ODS_DBEntities db = new AH_ODS_DBEntities())
            {
                List<string> rs = db.Sales.Where(s => s.CustomerRefNbr == c).ToList();
                if (rs.Any())
                {
                    //all items in rs are matches
                }
            }
        }
    }

答案 1 :(得分:1)

你应该在foreach之前初始化字符串i和c。这样您就可以在foreach中填充它,并在以后的代码中使用它。像这样:

using (AH_ODS_DBEntities db = new AH_ODS_DBEntities())
        {
            //XML CustomerRefNbr            
            string[] allFiles = Directory.GetFiles(@"C:\xml\");
            string i = "";
            string c = "";
            foreach (var @CRN in allFiles)
            {
                XElement xEle = XElement.Load(@CRN);
                IEnumerable<XElement> invoices = xEle.Elements();
                foreach (XElement pEle in invoices)
                {
                    c = pEle.Element("CustomerRef").Value;
                }

                //DB CustomerRefNbr
                IEnumerable<string> rs = db.Sales.AsQueryable().Select(crn => crn.CustomerRefNbr);
                foreach (string invoice in rs)
                {
                    i = invoice;
                }
            }

        }