领先的零,奇怪的行为

时间:2017-04-28 07:01:55

标签: c# entity-framework linq

所以最初的问题与Linq-to-SQL有关,但我真的认为它归结为Linq如何处理字符串中的前导零。在我原来的解决方案中,当我遇到这个奇怪的前导零行为时,我试图用Linq和实体框架( * )复制SQL的BETWEEN子句,请查看此处的示例:

myObj class

public class myObj
{
   public string A, B, C;
   public string Name;
   public myObj(string name, string a, string b, string c)
   {
      Name = name;
      A = a;
      B = b;
      C = c;
   }
}

制作一个包含三个myObjs的列表

List<myObj> myList = new List<myObj>();

启动它们并为它们指定名称和值。然后将它们添加到列表中。

myObj moA = new myObj("noLeadingZero", "1000", "2000", "3000");
myObj moB = new myObj("noLeadingZero", "3000", "4000", "5000");

在对象&#34; LeadingZero&#34;我将最后一个值设为前导零。

myObj moC = new myObj("LeadingZero", "5500", "6000", "0300");

然后将它们添加到列表中:

myList.Add(moA);
myList.Add(moB);
myList.Add(moC);

现在!

尝试使用Linq来获取区间内的所有对象&#34; -1&#34;至&#34; 9999&#34;我最终只得到了三个物体中的两个。那可能是对的! &#34; LeadingZero&#34; -object应该在结果中,因为&#34; 0300&#34;高于-1且低于9999。

var match = (from lst in myList where
             lst.A.CompareTo("-1") >= 0 &&
             lst.A.CompareTo("9999") <= 0 &&

             lst.B.CompareTo("-1") >= 0 &&
             lst.B.CompareTo("9999") <= 0 &&

             lst.C.CompareTo("-1") >= 0 &&
             lst.C.CompareTo("9999") <= 0
             select lst).ToList();

如果我删除最后一部分( lst.C.CompareTo(&#34; -1&#34;)&gt; = 0&amp;&amp; lst.C.CompareTo(&#34; 9999&#34) ;)&lt; = 0 )或者如果我更改&#34; -1&#34;到&#34; 0&#34;我将获得所有三个对象。但为什么Linq表现得像这样?

(*)在我原来的解决方案中,&#34; -1&#34;值被保存而不是null。

1 个答案:

答案 0 :(得分:0)

进行整数比较或将A,B和C声明为int

var match = (from lst in myList where
         Convert.ToInt32(lst.A).CompareTo(-1) >= 0 &&
         Convert.ToInt32(lst.A).CompareTo(9999) <= 0 &&

         Convert.ToInt32(lst.B).CompareTo(-1) >= 0 &&
         Convert.ToInt32(lst.B).CompareTo(9999) <= 0 &&

         Convert.ToInt32(lst.C).CompareTo(-1) >= 0 &&
         Convert.ToInt32(lst.C).CompareTo(9999) <= 0
         select lst).ToList();