C# 如果字段为空,如何用Linq替换值?
我有以下报告:C# 如果字段为空,如何用Linq替换值?,c#,linq,C#,Linq,我有以下报告: var menuItems = _menuRepository.GetPk(pk) .Where(m => m.Status == "00") .OrderBy(m => m.Order) .Select(m => new MenuItem { PartitionKey = m.Partition
var menuItems = _menuRepository.GetPk(pk)
.Where(m => m.Status == "00")
.OrderBy(m => m.Order)
.Select(m => new MenuItem
{
PartitionKey = m.PartitionKey,
RowKey = m.RowKey,
Order = m.Order,
Order1 = m.Order.Substring(0, 1),
Order2 = m.Order.Substring(2, 1),
Order3 = m.Order.Substring(4, 1),
Order4 = m.Order.Substring(6, 2),
Title = m.Title,
Type = m.Type,
Link = m.Link,
TextLength = m.TextLength
});
如果存在订单为null或空的记录,则此操作失败。如果m.Order为null或空,有没有一种方法可以替换一个由8个零组成的字符串,并用一个零替换所有的Order.substring
Order1 = m.Order == null ? "0" : m.Order.Substring(0, 1)
条件运算符(?:)也称为三值运算符,根据布尔表达式的值返回两个值中的一个
<boolean condition> ? <value returned if true> : <value returned if false>;
?:;
或
您可以使用运算符:
var menuItems = _menuRepository.GetPk(pk)
.Where(m => m.Status == "00")
.OrderBy(m => m.Order)
.Select(m =>
{
var orderOrEmpty = m.Order ?? "00000000";
return new MenuItem
{
PartitionKey = m.PartitionKey,
RowKey = m.RowKey,
Order = m.Order,
Order1 = orderOrEmpty.Substring(0, 1),
Order2 = orderOrEmpty.Substring(2, 1),
Order3 = orderOrEmpty.Substring(4, 1),
Order4 = orderOrEmpty.Substring(6, 2),
Title = m.Title,
Type = m.Type,
Link = m.Link,
TextLength = m.TextLength
};
});
如果
null
或为空,则听起来您希望将m.Order.SubString
调用的结果替换为0。方法是,如果m.Order
值为null/empty,则只使用所有0的字符串
.Select(m => {
var order = m.Order ?? "00000000";
return new MenuItem {
PartitionKey = m.PartitionKey,
RowKey = m.RowKey,
Order = m.Order,
Order1 = order.Substring(0, 1),
Order2 = order.Substring(2, 1),
Order3 = order.Substring(4, 1),
Order4 = order.Substring(6, 2),
Title = m.Title,
Type = m.Type,
Link = m.Link,
TextLength = m.TextLength
}});
我将编写一个扩展方法
IfNotNull
,并将其用作
m.Order.IfNotNull(s=>s.Substring(0,1),"0")
//or
m.Order.IfNotNull(s=>s.Substring(6,2),"00")
//or
m.Order.IfNotNull(s=>s.Substring(6,2))
公共静态类MyExtensions
{
公共静态TOut IfNotNull(此T目标,Func valueFunc,TOut defValue=default(TOut))
T:在哪里上课
{
返回目标==null?定义值:valueFunc(目标);
}
}
什么失败了?子字符串或OrderBy?要根据他的问题调整它,应该是Order1=m.Order==null?“00000000”:m.Order.Substring(0,1)
您可以阅读更多关于三元运算符的内容,我认为,希望整个顺序
为“00000000”
。我更正了我的例子。你是说空合并运算符
.Select(m => {
var order = m.Order ?? "00000000";
return new MenuItem {
PartitionKey = m.PartitionKey,
RowKey = m.RowKey,
Order = m.Order,
Order1 = order.Substring(0, 1),
Order2 = order.Substring(2, 1),
Order3 = order.Substring(4, 1),
Order4 = order.Substring(6, 2),
Title = m.Title,
Type = m.Type,
Link = m.Link,
TextLength = m.TextLength
}});
m.Order.IfNotNull(s=>s.Substring(0,1),"0")
//or
m.Order.IfNotNull(s=>s.Substring(6,2),"00")
//or
m.Order.IfNotNull(s=>s.Substring(6,2))
public static class MyExtensions
{
public static TOut IfNotNull<T, TOut>(this T target, Func<T, TOut> valueFunc,TOut defValue=default(TOut))
where T : class
{
return target == null ? defValue : valueFunc(target);
}
}