我这里有问题。我试图将sql字段的最大值设为,
LastInvoiceNo = Convert.ToInt64(dbContext.InvoiceMaster.Max(e => e.InvoiceNo));
但它给了我错误的值,因为“InvoiceNo”的列类型是varchar。 所以我尝试将其转换为Int64为
LastInvoiceNo = dbContext.InvoiceMaster.Max(e =>Convert.ToInt64(e.InvoiceNo));
和
LastInvoiceNo = dbContext.InvoiceMaster.Select(e => Int64.Parse(e.InvoiceNo)).Max();
但它引发了一个例外
LINQ to Entities无法识别方法'Int64 Parse(System.String)'方法,并且此方法无法转换为商店表达式。
答案 0 :(得分:3)
您得到的错误是因为EF试图将您的linq查询转换为实际的SQL语句,但它不能。
您可以做的是通过强制查询执行来本地传输数据,然后您就可以转换为Int64并检查最大值。
这样的事情:
LastInvoiceNo = dbContext.InvoiceMaster.ToList().Max(e => Convert.ToInt64(e.InvoiceNo));
如果您在该表中有数百万行,那么不确定这是否是最好的事情。
干杯
答案 1 :(得分:0)
如果您正在使用MSSQL,您可以尝试使用专门设计用于LINQ查询的SqlFunctions
静态类,并将其转换为本机服务器功能。看起来有点奇怪,但以下可能有用:
dbContext.InvoiceMaster.Max(e =>SqlFunctions.Replicate("0", 16-e.InvoiceNo.Length) + e.InvoiceNo);
我在这里要做的是模拟在SqlFunctions中不可用的PadLeft函数,因此让所有字符串按长度标准化,您可以选择最大值然后将其转换为实际数字。