实体框架 - 如何在查询中从String转换为Integer

时间:2013-04-11 15:37:44

标签: c# entity-framework entity-framework-4 typeconverter sql-function

我有一个遗留数据库,其中相同的ID存储有多个表示(字符串和整数)。我需要根据密钥加入查询。

我知道SqlFunctions.StringConvert,但它对我的情况不起作用,因为ID有0前缀,并且数字的规范表示与其他表示没有字符串等效。

如何将我的数字字符串值转换为查询中的整数?

5 个答案:

答案 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不喜欢这样,所以你需要尝试这样做,而不是在比较前删除前导零:

user trimstart in entity framework query

答案 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;
}