使用Linq和c#计算连续多少个单元格为空

时间:2017-02-27 14:23:59

标签: c# linq

我有一些电影的数据库。我想计算每个单独的id有多少个单元格为空或为空并显示计数。

前:

Id标题价格类型

1 Last of Us 10 null

2其他8恐怖

3 X-Men null null

我希望能够为id 3显示有2个缺失值,或者id 1显示有1个缺失值

到目前为止,我有这段代码:

 Movie movieId = _context.Movies.Find(id);
 var movies = from m in _context.Movies where m.ID == id select m ;
 var model = new PartialModel();
 model.Count = movies.Count();

不幸的是,代码只显示选择了具有特定ID的电影数量。我试过x => x = null表示计数,但它给出了语法错误。

我想我需要一种从电影中获取空白字段的方法,但我不知道该怎么做。

谢谢

3 个答案:

答案 0 :(得分:3)

您最好的选择是在类型上添加属性或方法,并使用反射来计算具有null值的公共属性的数量。不要在linq to sql电话中进行,它不属于那里。

public class Movie {
  // existing properties


  // this should not be mapped back to the EF store
  public int NumberOfNullPropValues => typeof(Movie).GetProperties().Count(x => x.GetValue(this, null) == null);
}

请注意,这仅适用于引用类型和Nullable<T>,它不会检查空字符串,也不会检查类型是结构的默认值(如int的0) 。此外,如果您要检查非公共属性,则需要将绑定标记传递给GetProperties调用

答案 1 :(得分:1)

您可以使用Reflection

像这样(一个返回对象有多少个null属性的方法):

public int GetNullProperiesCount(object anyObject)
{
    var objType = anyObject.GetType();
    var nullCount = 0;

    foreach(var propInfo in objType.GetProperties())
    {
        if(propInfo.CanRead)
        {
           object val = propInfo.GetValue(anyValue, null);
           if(val == null) ++nullCount;
        }
    }
    return nullCount;
}

然后,您可以遍历任何集合并获取其项目有多少个null属性。

答案 2 :(得分:0)

就CPU周期而言,反射可能很昂贵。我使用DataSet来读取和检查数据。它很容易做到,并没有强加Linq的开销