【问题标题】:LINQ... ignore nulls for dropdown C#LINQ ...忽略下拉C#的空值
【发布时间】:2012-11-10 00:17:58
【问题描述】:

我有一个返回一组客户的简单 linq 查询。客户由五个字段组成,其中一些字段可能为空。

公司、业务部门、部门、产品组、联系人

一家大公司的客户可能在所有五个字段中都有值(以下是虚构的!):

Microsoft - Windows - 开发组 - 开始菜单团队 - Bob Jones

较小的客户可能是:

Bob 的早餐角 - NULL - NULL - NULL - Bob Jones

所以我有一个下拉列表,我想在其中列出所有客户:

        var qryGetClients = from m in db.clients
                            select new
                            {
                                clientid = m.clientID,
                                corpName = m.corpName,
                                buName = m.buName,
                                divName = m.divName,
                                pgName = m.pgName,
                                contactName = m.contactName

                            };



        DDClientList.DataSource = qryGetClients;
        DDClientList.DataTextField = "completeclientname";
        DDClientList.DataValueField = "clientid";
        DDClientList.DataBind();

现在我知道我可以在查询中执行此操作以将字段连接成一个字段:

    completeclientname= m.corpName + " " + m.buName + " " + m.divName + " " + m.pgName + " " + m.contactName

但如果其中一个字段为空,我的下拉菜单会显示一个完全为空的值。 (例如,它不会“跳过”记录,而是显示一个空行。

即使我在一个或多个字段中有空值,如何让下拉菜单显示“完整客户端名称”?

【问题讨论】:

  • 是 linq-2-Something 吗?在 linq-2-objects 中,null 字段不应该导致 null 结果值,它看起来更像是一个 DB 逻辑
  • 实体框架... linq to sql?
  • 我认为你最好用 Linq-2-objects 来做这件事。 Linq-2-Entity 可能不会给您带来任何性能优势,因为您不过滤任何内容。
  • 我确实有一个 where 子句,但为了简单起见,我把它省略了。 (这里 isactive = true)
  • 然后在您的where 子句之后在我的回答中执行AsEnumerable。在这种情况下,过滤将在数据库中完成,而字符串连接将在客户端完成

标签: linq null


【解决方案1】:
var fields = new [] { m.corpName, m.buName, m.divName, m.pgName, m.contactName }
                                .Where(s => s != null);
completeclientname = string.Join(" ", fields);

为了从 Linq-2-entity 切换到 Linq-2-objects,请使用 AsEnumerable:

var qryGetClients = db.clients.AsEnumerable()
                              .Select(m => new {
                                                 clientid = m.clientID,
                                                 corpName = m.corpName,
                                                 ...
                                                 completeclientname = ...
                                               })
                              .ToArray();

【讨论】:

  • 太快了。太感谢了。好的,我是一个 asp.net 新手......我在哪里放那个代码?我不只是把它放在查询之后,对吗? (因为“m”不是在查询之外被识别的任何东西。)或者你有什么成为查询?
  • @walstib,请随意将其放入 oneliner 并直接放入您的 new { ... } 子句中。请注意,我上面的评论可能会影响此答案是否适合您。
  • 我将不得不接受有关术语的教育!我怎么知道我使用的是 Linq2entity、linq2objects 还是 linq2sql?
  • 如果你正在使用IEnumerable(反对使用IQueryable),那么你正在处理linq-2-objects。否则,这取决于您从哪里获取数据。如果你从 Entity Framework 得到它,那么它是一个 linq-2-Entity,如果你从 linq-2-sql 得到它,那么它就是 linq-2-sql 等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多