实体框架-如何在查询中从字符串转换为整数
本文关键字:字符串 转换 整数 查询 框架 实体 | 更新日期: 2023-09-27 18:08:35
我有一个具有相同ID的遗留数据库,存储有多个表示形式(字符串和整数)。我需要我的查询基于键连接。
我知道SqlFunctions.StringConvert
,但它不适合我的情况,因为ID有0前缀和数字的规范表示没有字符串等价于其他表示。
我如何将我的数字字符串值转换为整数从我的查询?
不确定这是否是你想要的,但由于你的数字字符串可能包含字符你可以从字符串
中提取数字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;
你不能直接用TrimStart吗?
<年代> id.TrimStart("0"); 年代>
(编辑)实际上LINQ对实体不喜欢这样,所以你需要尝试这样做,而不是在比较之前剥离前导零:
我将创建一个类来存储您的表示。
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, datallength和stringconvert的组合?(请将模拟的SqlFunctions替换为真实的,它应该在2个实体上下文中运行在表上):
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;
}