【问题标题】:LinQ how to change a integer like 1 to string 001LinQ如何将像1这样的整数更改为字符串001
【发布时间】:2016-05-28 09:34:39
【问题描述】:

我的数据库中有一个包含四列的表:

string: year
string: weeknr
int:    number

在其他表中,我将这些列组合成 yywwnnn 作为字符串。

数字列是标识列。

现在我想从一个表中检索一些记录,我想将这些记录加入到提到的表中。

类似:

from R in db.Requests
join RN in db.RequestNumbers on R.RequestNumber equals (RN.Year + RN.Weeknr + RN.Number)

但当然 RN.Number 是一个整数,我需要它是一个 3 位数的字符串。

所以:
16 07 1 ==> 1607001
16 07 10 ==> 1607010
16 07 100 ==> 1607100

我试过这个:

from R in db.Requests
join RN in db.RequestNumbers on R.RequestNumber equals (RN.Year + RN.Weeknr + (RN.Number.toString().PadLeft(3,char.Parse("0")))

但 PadLeft 无法识别。
有没有其他解决办法?

[编辑] 这是完整的方法:

public List<RequestList> getMyRequests(string userID)
{
  var result = (from R in db.Requests
                join MT in db.MainTorsList on R.Category equals MT.MainTorsListID into MTL
                from MT in MTL.DefaultIfEmpty()
                join ST in db.SubTorsList on R.RequestType equals ST.SubTorsListID into STL
                from ST in STL.DefaultIfEmpty()
                join S in db.StatusList on R.RequestStatus equals S.StatusListID into SL
                from S in SL.DefaultIfEmpty()
                join RN in db.RequestNumber on R.RequestNumber equals RN.Year + RN.Week + (RN.Number.ToString().PadLeft(3, char.Parse("0"))) into RNL
                from RN in RNL.DefaultIfEmpty()
                where R.CreatedBy == userID && RN.Removed == false

                select new
                {
                  RequestID = R.RequestID,
                  RequestDate = R.CreatedOn,
                  RequestNumber = R.RequestNumber,
                  Category = MT.Name,
                  RequestType = ST.Name,
                  Description = R.RequestDescription,
                  Status = S.Name,
                  Options = ""
                }
                );

  List<RequestList> requests = (List<RequestList>)result.ToList().ToNonAnonymousList(typeof(RequestList));

  return requests;
}

错误信息:

Additional information: LINQ to Entities does not recognize the method 'System.String PadLeft(Int32, Char)' method, and this method cannot be translated into a store expression.

【问题讨论】:

  • 您可以使用 .ToString() 方法执行此操作。然后重新追加。 int a = 1; console.writeline(a.tostring("000"));
  • 无法识别“PadLeft”是什么意思?您收到错误消息吗?您使用的是 LINQ-to-SQL 还是实体框架?
  • 我已经用代码和错误信息更新了问题。

标签: c# linq


【解决方案1】:

诀窍是像这样使用DbFunctions.Right

DbFunctions.Right("00" + RN.Number, 3)

即在开头添加足够的零,并从结尾处获取所需的确切长度。

LINQ to Entities 支持所有使用的方法(至少在目前最新的 EF6.1.3 中)。

【讨论】:

    【解决方案2】:

    当您创建一个指向 sql 数据库的 linq 表达式时,它会被转换为一个 sql 查询,并且有些函数不能被翻译成sql(如string.Format()object.ToString())。当使用不受支持的功能时,会引发类似您的异常。

    'SqlFunctions' 和 'EntityFunctions' 类提供了可以在 Linq to Entities 表达式中使用的“CRL 方法”。

    SqlFunctions.StringConvert() 将整数转换为其字符串表示,允许您指定所需的长度(用前导空格填充)。

    您可以使用此函数并调用string.Replace(string, string) 方法(是的,它可用)将空格替换为零。

    这是查询:

    from R in db.Requests
    join RN in db.RequestNumbers on R.RequestNumber equals 
    (RN.Year + RN.Weeknr + SqlFunctions.StringConvert((double)RN.Number, 3).Replace(" ", "0"))
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的背景说明。
    【解决方案3】:

    你试过了吗:

         Rn.number.value.ToString("000", System.Globalization.CultureInfo.InvariantCulture)
    

    ?

    【讨论】:

      【解决方案4】:

      您可以创建所需格式的字符串,然后在您的表达式中使用它。这是我根据第四个字符后数字的长度填充“0”的一个简单示例。你不需要分配 var mystring = "your string" 等等,我只是这样做,所以我不需要每次都输入所有场景来运行它:

      var exampleA = "16071";
      var exampleB = "160710";
      var exampleC = "1607100";
      
      var mystring = exampleB;
      
      var afterFourthCharacter = mystring.Substring(4);
      
      var result = mystring.Substring(0,4) + afterFourthCharacter.PadLeft(mystring.Length + (3 - mystring.Length), '0');
      

      【讨论】:

      • 这是在 C# 中,但我在 Linq 中需要它到实体。
      【解决方案5】:

      使用值创建动态键并让 Linq 对其进行排序。 像这样的:

      db.Requests                   // Outer
        .Join(db.RequestNumber      // Inner
              R => new  { R.Year, R.Weeknr, R.Number },    // Outer key
              RN => new { RN.Year, RN.Weeknr, RN.Number }, // Inner key
              (R, RN) => new
                  {
                    R.Year,
                    RN.Number,
                    ....
                  }
             );
      

      请注意,因为这是 EF(或 Linq To SQL),您可能必须同时关闭 RequestsRequestNumber 上的整个表(使用 .ToList())。


      或者更好的是,如果您可以访问数据库表,只需创建一个计算列,其启发式方法会将所有三个列组合成一个唯一的标识键。然后在 Linq 中,它可以从计算列中加入该 id。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多