实体框架-如何在查询中从字符串转换为整数

本文关键字:字符串 转换 整数 查询 框架 实体 | 更新日期: 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;
}