我的数据库中有一个包含四列的表:
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.
答案 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。