【问题标题】:Returning the result from a linq query but with one value modified从 linq 查询返回结果,但修改了一个值
【发布时间】: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)] 数据注释,所以无论如何它都会失败。

标签: c# .net linq


【解决方案1】:

我不建议在 Linq 中这样做。您正在将业务逻辑(应默认初始化空值)与 DataAcess 代码(获取我的产品)混合。

您能否不更改您的产品类别本身。将“类别”属性修改为类似的内容。

private Category _category

public Category Category 
{
    get 
    {
        if (_category == null)
            _category = new Category();

        return _category;
    }
    set
    {
        _category = value;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多