我有一个遗留数据库,其中相同的ID存储有多个表示(字符串和整数)。我需要根据密钥加入查询。
我知道SqlFunctions.StringConvert
,但它对我的情况不起作用,因为ID有0前缀,并且数字的规范表示与其他表示没有字符串等效。
如何将我的数字字符串值转换为查询中的整数?
答案 0 :(得分:0)
不确定您是否正在寻找,但由于您的数字字符串中可能包含字符,因此您只能从字符串中提取数字
var getNumbers =Convert.ToInt32 (from t in stringToQuery
where char.IsDigit(t)
select t).ToArray().ToString());
答案 1 :(得分:0)
可能你应该尝试这样的事情:
//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;
答案 2 :(得分:0)
你不能只使用TrimStart吗?
id.TrimStart( '0');
(编辑)实际上LINQ to Entities不喜欢这样,所以你需要尝试这样做,而不是在比较前删除前导零:
答案 3 :(得分:0)
我会创建一个类来存储你的表示。
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
答案 4 :(得分:0)
如果你的字符串总是以规范数字结尾,那么它们可能类似于patindex,datalength和stringconvert的组合? (请将模拟的SqlFunction替换为real,它应该在表的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();
这些只是模拟的SqlFunctions:
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;
}