【问题标题】:Entity Framework - How to convert from String to Integer in query实体框架 - 如何在查询中从字符串转换为整数
【发布时间】:2013-04-11 15:37:44
【问题描述】:

我有一个旧数据库,其 ID 相同,存储了多种表示形式(字符串和整数)。我需要我的查询基于键加入。

我知道SqlFunctions.StringConvert,但它不适用于我的情况,因为 ID 具有 0 前缀,并且数字的规范表示与其他表示不具有字符串等价性。

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

【问题讨论】:

  • 您能举个例子说明您正在尝试做什么吗?我不太明白“数字的规范表示与其他表示不具有字符串等价”是什么意思。
  • 例如“0015”是一个有效的字符串 id,但“15”是它的规范表示。尽管存在不等式,但我希望它们相等

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


【解决方案1】:

不确定是否是您要查找的内容,但由于您的数字字符串中可能包含字符,您可以仅从字符串中提取数字

var getNumbers =Convert.ToInt32 (from t in stringToQuery
                   where char.IsDigit(t)
                   select t).ToArray().ToString());

【讨论】:

    【解决方案2】:

    也许你应该尝试这样的事情:

        //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;
    

    【讨论】:

      【解决方案3】:

      你不能只使用 TrimStart 吗?

      id.TrimStart('0');

      (编辑)实际上 LINQ to Entities 不喜欢这样,因此您需要尝试这样做以在比较之前去除前导零:

      user trimstart in entity framework query

      【讨论】:

        【解决方案4】:

        我会创建一个类来存储你的表示。

        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
        

        【讨论】:

        • 恐怕这不能翻译成查询,会在内存中执行
        【解决方案5】:

        如果你的字符串总是以规范数字结尾,它们可能是 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;
        }
        

        【讨论】:

          猜你喜欢
          • 2015-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-18
          • 2021-12-08
          • 1970-01-01
          相关资源
          最近更新 更多