LinQ如何将1之类的整数更改为字符串001

时间:2016-02-16 22:01:37

标签: c# linq

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

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.

5 个答案:

答案 0 :(得分:4)

诀窍是像这样使用DbFunctions.Right

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

即。在开头添加足够的零并从最后获取所需的确切长度。

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

答案 1 :(得分:2)

当您创建指向 sql -database的 linq 表达式时,它会被转换为 sql 查询,并且有些函数不能被翻译为 sql (例如//Shortened for everyone's sanity export class ClickRipple { constructor(CssAnimator, Element) { this.animator = animator; this.element = element; } attached() { this.element.parentElement.addEventListener("click", (event) => { this.playAnimation(event); }); } playAnimation(event) { //Math based on event //Animation with Aurelia's CssAnimator } } string.Format())。当使用不受支持的函数时,会引发与您类似的异常。

&#39; object.ToString()&#39;和&#39; SqlFunctions&#39;课程提供了CRL方法&#39;您可以在Linq to Entities表达式中使用。

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

您可以使用此功能并调用SqlFunctions.StringConvert()方法(是的,它可用)将空格替换为零。

这是查询:

string.Replace(string, string)

希望这有帮助。

答案 2 :(得分:2)

你有没有尝试过:

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

答案 3 :(得分:1)

您可以创建所需格式的字符串,然后在表达式中使用它。这是我做的一个简单的例子来填补&#39; 0&#39;取决于第四个字符后的数字长度。你不需要分配var mystring =&#34;你的字符串&#34;等等,我只是这样做所以我不需要每次都输入所有场景来运行它:

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');

答案 4 :(得分:1)

使用值创建动态密钥,然后让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),您可能必须同时关注.ToList()Requests上的整个表格(使用RequestNumber)。

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