我有一个旧数据库,其 ID 相同,存储有多种表示形式(字符串和整数)。我需要我的查询基于键加入。
我知道SqlFunctions.StringConvert
,但它不适用于我的情况,因为 ID 具有 0 前缀,并且数字的规范表示与其他表示不具有字符串等价性。
如何在查询中将我的数字字符串值转换为整数?
我有一个旧数据库,其 ID 相同,存储有多种表示形式(字符串和整数)。我需要我的查询基于键加入。
我知道SqlFunctions.StringConvert
,但它不适用于我的情况,因为 ID 具有 0 前缀,并且数字的规范表示与其他表示不具有字符串等价性。
如何在查询中将我的数字字符串值转换为整数?
你不能只使用 TrimStart 吗?
id.TrimStart('0');
(编辑)实际上 LINQ to Entities 不喜欢这样,所以你需要尝试这个而不是在比较之前去除前导零:
不确定这是否是您要查找的内容,但由于您的数字字符串中可能包含字符,您可以仅从字符串中提取数字
var getNumbers =Convert.ToInt32 (from t in stringToQuery
where char.IsDigit(t)
select t).ToArray().ToString());
也许你应该尝试这样的事情:
//example
List<string> texts = new List<string>();
List<int> integers = new List<int>();
for (int j = 1; j <= 10; j++)
{
text.Add("00" + j.ToString());
integers.Add(j);
}
var a = from t in texts
join i in integers on Convert.ToInt32(t) equals i
select t;
我会创建一个类来存储您的表示。
public sealed class CanonicalInt: IEquatable<int>, IEquatable<string>
{
private int _number;
private string _canonical
{
get
{
return ""; //logic to turn int into format
}
set
{
_number = 0; ////logic to turn string into format
}
}
public CanonicalInt(int number)
{
_number = number;
}
public CanonicalInt(string number)
{
_canonical = number;
}
public bool Equals(int other)
{
return _number.Equals(other);
}
public bool Equals(string other)
{
if(other == null)
return false;
return _canonical.Equals(other);
}
public static implicit operator int(CanonicalInt canonicalInt)
{
return canonicalInt._number;
}
public static implicit operator string(CanonicalInt canonicalInt)
{
return canonicalInt._canonical;
}
}
用法:
var number = new CanonicalInt(23);
var result = number == 23; // True
如果你的字符串总是以规范数字结尾,它们可能是 patindex、datalength 和 stringconvert 的组合?(请将模拟的 SqlFunctions 替换为真实的,然后它应该在表上的 2entities 上下文中运行):
string [] Strings = new string [] {"0015","0-00152","00-0012"};
int[] Integers = new int[] { 15,12};
var MixedResult = Strings.Where(s => Integers.Any(i => (PatIndex(StringConvert(i),s) + DataLength(StringConvert(i))) == DataLength(s))).ToList();
这些只是模拟的 SqlFunction:
private string StringConvert(int x)
{
return x.ToString();
}
private int PatIndex(string pattern,string target)
{
return target.IndexOf(pattern);
}
private int DataLength(string x)
{
return x.Length;
}