【问题标题】:Method 'First' or 'FirstOrDefault' don't give the right data [closed]方法'First'或'FirstOrDefault'没有提供正确的数据[关闭]
【发布时间】:2014-08-27 11:21:56
【问题描述】:

我前面的消息不正确,不要在其他帖子中得到答案。

这是我遇到问题的代码部分。

Libelle_TOT 和 Groupe_Alerte 是 VarChar(50)

foreach (var donneesDUMP in don)
    {
        if (cap.Any(c => c.PMRQTOTM == donneesDUMP.PMRQTOTM))
        {
            if(!cap.Any(c => c.Libelle_TOT == donneesDUMP.Libelle_TOT))
            {
                cnn.Resultat.Add(new Resultat
                {
                    NomTable = "CapitalisationActuelle",
                    Groupe_D_alerte = donneesDUMP.Groupe_Alerte,
                    NomChamp = "PMRQTOTM",
                    TOTMPMRQ = donneesDUMP.PMRQTOTM,
                    SiModifie = "Libelle TOT",
                    LibelléTOTAvant = cap.Select(c => c.Libelle_TOT).FirstOrDefault(),
                    //LibelléTOTAvant = cap.Any(c => !string.IsNullOrEmpty(c.Libelle_TOT))
                    //? cap.Select(x => x.Libelle_TOT).First(l => !string.IsNullOrEmpty(l))
                    //: " ",
                    LibelléTOTApres = donneesDUMP.Libelle_TOT,
                    Remarque = "Modifie"
                });
            }

两个

LibelléTOTAvant = cap.Select(c => c.Libelle_TOT).FirstOrDefault(),

LibelléTOTAvant = cap.Any(c => !string.IsNullOrEmpty(c.Libelle_TOT))
                    ? cap.Select(x => x.Libelle_TOT).First(l => !string.IsNullOrEmpty(l))
                    : " ",

有效,我没有任何构建错误。但每次我遇到一个问题时,可能是 .First() 和 .FirstOrDefault()。它总是写第一个 Libelle_TOT,而不是好的。

这是我得到的一个例子: http://zupimages.net/viewer.php?id=14/35/6ri4.png

LibelléTOTAvant 有时具有相同的值 (test5),因为 test5 是表 capitalisationActuelle 的第一行,但它不是正确的值。例如,对于 LibelléTOTApres = qfd,我应该得到 test3 而不是 test5,等等。

【问题讨论】:

  • 我不完全确定你期望它应该做什么?什么是“好人”?你自己说它“总是写第一个……”——这正是 First/FirstOrDefault 应该的——因此得名。
  • @Slava 您确实回答了另一个问题 Slava。但现在我的问题不同了。它有效,但没有给出正确的答案。

标签: c# wpf database linq visual-studio-2013


【解决方案1】:

如果我理解正确,您可能需要选择与当前 donneesDUMP 的 PMRQTOTM 匹配的特定行:

LibelléTOTAvant = cap.First(c => c.PMRQTOTM == donneesDUMP.PMRQTOTM).LibelleTOT;

请注意,它是 First() 中的 WHERE 条件,用于选择与指定条件匹配的行,而 First 用于获取第一行(现在仅此行) - 与更详细的版本相同:

LibelléTOTAvant = cap.Where(c => c.PMRQTOTM == donneesDUMP.PMRQTOTM).First().LibelleTOT;

【讨论】:

  • LibelléTOTAvant = cap.First(c => c.PMRQTOTM == donneesDUMP.PMRQTOTM).LibelleTOT;正是我想要的。非常感谢!
【解决方案2】:

嗯,这个:

LibelléTOTAvant = cap.Select(c => c.Libelle_TOT).FirstOrDefault(),

将只选择上限的第一个Libelle_TOT,因为您没有给出任何条件

还有这个:

LibelléTOTAvant = cap.Any(c => !string.IsNullOrEmpty(c.Libelle_TOT))
                    ? cap.Select(x => x.Libelle_TOT).First(l => !string.IsNullOrEmpty(l))
                    : " ",

应该选择第一个非空的Libelle_TOT,尽管您可以将其替换为:

LibelléTOTAvant = cap.FirstOrDefault(c => !string.IsNullOrEmpty(c.Libelle_TOT));

如果没有空的诽谤,它会给你 null。

你只是想选择第一个非空的 libelle 吗?

【讨论】:

  • 我不是想得到第一个非空的 libelle。这是数据库之一:capitalisationActuelle link 另一个是相同的,具有不同的值。我检查一个表的“PMRQTOTM”是否存在于另一个表中,如果存在,我检查“libelleTOT”是否相同。如果是不同的,我将其插入“LibelléTOTAvant”
  • 但问题是,当每个条件都被验证时(相同的“PMRQTOTM”,不同的“libelleTOT”,它不会将相应的“libelleTOT”插入“LibelléTOTAvant”而是第一个“libelleTOT”桌子。
  • 哎呀,已经回答了,我来晚了,但是是的,你只是没有查询正确的东西
猜你喜欢
  • 2018-05-04
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2021-01-27
  • 2015-04-21
  • 1970-01-01
  • 2012-06-03
相关资源
最近更新 更多