方法'第一'或者' FirstOrDefault'没有提供正确的数据

时间:2014-08-27 11:21:57

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

我面前的消息不正确,请不要回答其他帖子。

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

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是table capitalisationActuelle的第一行,但它不是正确的值。例如,对于LibelléTOTApres= qfd,我应该得到test3而不是test5等。

2 个答案:

答案 0 :(得分:1)

嗯,这个:

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));

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

您是否只是想选择第一个非空的libelle?

答案 1 :(得分: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;