继续抛出错误,我不知道为什么

时间:2012-05-30 14:12:25

标签: c# linq

我正在尝试在数据表中搜索非唯一值,并且我一直收到此错误

  

过滤器表达式'PROV_NEW'不会计算为布尔项。

我跑的时候。

这是我的代码:

public class GetData
{
    datalogiclayer.TableSetup dal;
    DataSet ds;

    public delegate void InvalidTableDataDelegate(string ErrorMessage);
    public event InvalidTableDataDelegate InvalidTableData;

    public delegate void SetupDataLoadedDelegate(System.Data.DataSet dv, string TableName);
    public event SetupDataLoadedDelegate SetupDataLoaded;

    public GetData()
    {
        dal = new datalogiclayer.TableSetup();
    }

    public void Update(DataSets.Setup ds)
    {
        try
        {
            string errMsg = string.Empty;

            if (ValidateTable(ds.SETUP_MWPROV, out errMsg))
            {
                dal.UpdateDatabase(ds);
            }
            else
            {
                if (InvalidTableData != null)
                    InvalidTableData(errMsg);
            }
        }
        catch (Exception)
        {
            throw;
        }
    }

    private bool ValidateTable(DataSets.Setup.SETUP_MWPROVDataTable dt, out string TableIssues)
    {
        try
        {
            //NewCode not used for other row
            DataRow[] result = dt.Select("PROV_NEW = ''");
            DataRow[] dupresults = dt.Select("PROV_NEW");
            TableIssues = string.Empty;
            DataTable dtTemp = dt.DefaultView.ToTable(true, "NEW_PROV");

            if (dupresults.Length == 0)
            {
                return true;
            }
            else
            {
                IEnumerable<DataRow> uniqueCodes = dupresults.AsEnumerable().Distinct(DataRowComparer.Default);

                Console.WriteLine("Unique Provider Codes:");

                foreach (DataRow NEW_PROV in uniqueCodes)
                {
                    Console.WriteLine(NEW_PROV.Field<Int32>("PROV_NEW"));
                }

                return false;
            }          
        }
        catch (Exception)
        {
            throw;
        }
    }
}

因为你可以看到我在数据表中搜索唯一的行,当抛出异常时我真的去保存数据。并且它给出了高于上面的误差。

4 个答案:

答案 0 :(得分:4)

        DataRow[] dupresults = dt.Select("PROV_NEW");

dt.Select的参数是一个过滤器。 "PROV_NEW"不是有效的过滤器,因为表达式不会导致布尔值。我相信你会把它与SQL混淆,在那里你可以要求它选择一个列。但是您不需要这样做,因为稍后您需要从PROV_NEW列中选择不同的。如果你想确保整行是不同的,那么这就是你需要做的全部。

如果您只想比较PROV_NEW列,您可以编写一个自定义相等比较器,仅查看您的PROV_NEW列。当您使用&gt; this version &lt;。

致电distinct时,您可以引用自定义比较器

或者Grant Winney建议您在使用distinct之前可以使用Linq仅选择单个列。请参阅their answer中的评论。

答案 1 :(得分:2)

检查代码中的以下行:

DataRow[] dupresults = dt.Select("PROV_NEW");

您是不是要在PROV_NEW之后再添加一个值?你在上面的行中正确地做了,所以我假设它只是一个错误。有时第二双眼睛有帮助。 :)

答案 2 :(得分:1)

看起来这条线路错了:

DataRow[] dupresults = dt.Select("PROV_NEW");

DataTable需要过滤器表达式作为参数,“PROV_NEW”不是过滤器表达式。有关详细信息,请参阅MSDN Documentation

答案 3 :(得分:1)

检查表达式“PROV_NEW”的结果。在某个地方,某些方法正在寻找一个结果的布尔类型,并且你的表达式会产生其他东西。我的2美分:))