4

我有一个 linq 查询,有时字符串字段产品名称可能为空,为空。这是表中的一个新字段,如果尚未输入数据,则在运行查询时会出错。我需要做的是检查 null,如果 null 用下拉列表中的文本值替换 null/空值。我已经尝试了几件事,但无法让它工作。

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/空值。

4

3 回答 3

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
于 2013-10-02T17:30:43.170 回答
2

答案来自我的同龄人布拉德。对于想知道如何使用 linq 替换空/空值的其他人,请参见下文。

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;
}
于 2013-10-03T00:47:30.310 回答
1

当您在查询中调用 orderby 时,LINQ to SQL 将尝试将其解析为 SQL 中的 order by 语句。由于 SQL 没有用于条件 order by 语句的方法,因此该方法将无法从 LINQ 编译。

可以实现您想要的,但是需要订购设置的客户端而不是服务器端。我的建议是在没有 order by 的情况下运行查询,并且在您需要订购时,首先将集合转换为 IEnumerable 集合。这会将来自 IQueryable 的结果拉入内存,并且您将能够针对对象集合运行 orderby。

基本流程是这样的:queryable.AsEnumerable().OrderBy()

这里最大的收获是要记住 LINQ 会在您请求对集合进行枚举时尝试将 IQueryable 转换为 SQL 查询。这里有一个很好的高级解释:http: //blog.worldmaker.net/2013/mar/11/mini-lecture-linq-visualization/

于 2013-10-02T17:42:22.283 回答