我有一个linq查询,有时字符串字段,产品名称可能为空,为null。 这是表中的新字段,如果尚未输入数据,则在运行查询时出现错误。我需要做的是检查null,如果为null,则用下拉列表中的文本值替换null / empty值。我已经尝试了几件事,但无法让它发挥作用。
public IQueryable<Product> BindProduct([Control("ddProductName")] int? ProductNameId)
{
var prod = from c in _DbContext.Products
where c.ProductNameId == ProductNameId
orderby string.IsNullOrEmpty(c.ProductName) ? ddProductName.SelectedItem.Text : c.ProductName,
c.ItemNumber
select c;
return prod;
}
已更改为:
public IQueryable<Product> BindProduct([Control("ddProductName")] int? ProductNameId)
{
var prodName = ddProductName.SelectedItem.Text;
var prod = from c in _DbContext.Products
where c.ProductNameId == ProductNameId
let sortName = c.Name ?? prodName
orderby sortName, c.ItemNumber
select new { c, sortName };
return prod;
}
更新 我不认为我很清楚。我需要做的是检查null,如果为null,则用下拉列表中的文本值替换null / empty值。
答案 0 :(得分:7)
“让”关键字可以解决问题。
这是一个LINQPad示例:
var products = Enumerable.Range(0, 100).Select(q => new {ProductNameId = 1, ProductName = (q % 15 == 0 ? null : (q % 3 == 0 ? "Fizz" : (q % 5 == 0 ? "Buzz": q.ToString()))), ItemNumber = q});
var ddProductName_SelectedItem_Text = "FizzBuzz";
var ProductNameId = 1;
var prod = from c in products
where c.ProductNameId == ProductNameId
let sortName = c.ProductName ?? ddProductName_SelectedItem_Text
orderby sortName, c.ItemNumber
select c;
return prod; //prod.Dump(); //for linqpad debugging
答案 1 :(得分:2)
答案来自我的同行布拉德。对于其他想知道如何使用linq替换null /空值的人,请参见下文。
public IQueryable<Product> BindProduct([Control("ddProductName")] int? ProductNameId)
{
var prodName = ddProductName.SelectedItem.Text;
var prod = _DbContext.Products.Where(c => c.ProductNameId == ProductNameId).ToList().Select
(p =>
{
p.Name = string.IsNullOrEmpty(p.Name) ? prodName : p.Name;
return p;
}).OrderBy(p => p.Name).ThenBy(p => p.ItemNumber).AsQueryable();
return prod;
}
答案 2 :(得分:1)
当您在查询中调用orderby时,LINQ to SQL将尝试将其解析为SQL中的order by语句。由于SQL没有方法用于条件顺序by语句,因此该方法将无法从LINQ编译。
您可以实现的目标,但需要订购设置的客户端而不是服务器端。我的建议是在没有顺序的情况下运行查询,并且在您需要订购时,首先将集合转换为IEnumerable集合。这将从IQueryable中获取结果,并且您将能够针对对象集合运行orderby。
基本流程将是这样的:queryable.AsEnumerable()。OrderBy()
这里最重要的一点是要记住,LINQ会尝试将IQueryable转换为SQL请求,以便在请求对集合进行枚举时进行查询。这里有一个非常好的高级解释:http://blog.worldmaker.net/2013/mar/11/mini-lecture-linq-visualization/。