簡體   English   中英

實體框架-如何在查詢中從字符串轉換為整數

[英]Entity Framework - How to convert from String to Integer in query

我有一個具有相同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 to Entities不喜歡這樣,因此您需要嘗試一下,而不是在比較之前去除前導零:

實體框架查詢中的用戶trimstart

我將創建一個類來存儲您的表示形式。

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,datalength和stringconvert的組合? (請用真實的替換模擬的SqlFunction,它應該在表的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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM