【发布时间】:2013-05-24 18:37:22
【问题描述】:
我有这样的课
public class Product
{
public int Id {get;set;}
public string Name {get;set;}
public Category Category {get;set;}
}
现在我想用 Linq 查询一个列表
var result = from p in products
select p;
我想要实现的是结果将设置一个默认类别,如果它是空的。
我能做的就是这个
var result = from p in products
select new Product()
{
Id = p.Id,
Name = p.Name,
Category = p.Category ?? new Category()
}
但这需要我重新设置每个字段。 但这不是我想要的,因为我的真实世界实体有大约 50 个属性而不是 3 个,如果我将来添加另一个属性,我还必须重新编辑代码。 我的想法更像是这样的:
var result = from p in products
select p { Category = p.Category ?? new Category() };
但这不会编译。
就像我在构建产品时会做的那样:
var product = new Product() { Category = new Category() };
我知道我可以这样做:
foreach (var p in result)
{
if(p.Category == null)
p.Category = new Category();
}
但我正在将结果传递给调用者,此时我不想遍历我的产品。
【问题讨论】:
-
为什么不首先初始化属性?如果产品应该至少有一个使用默认构造函数初始化的类别,请相应地初始化支持字段。
-
如果您使用 ORM 作为数据源,这可能会导致新类别被无意中插入到数据库中。
-
这不会发生。目前我正在使用
select new Product...方法并重新分配每个属性。缺点是每次向我的类添加另一个属性时我都必须修改代码。这是危险的。我永远不会存储结果,即使我会尝试,我的模型在 category.name 上有一个[MinLength(5)]数据注释,所以无论如何它都会失败。