所以最初的问题与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。
答案 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();