我有一些电影的数据库。我想计算每个单独的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表示计数,但它给出了语法错误。
我想我需要一种从电影中获取空白字段的方法,但我不知道该怎么做。
谢谢
答案 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的开销