0

我有一张桌子,用来存放一些产品。

ProductA
ProductB
ProductC

其中一个要求是一种产品可以属于另一种

ProductA
ProductD -> ProductA
ProductE -> ProductA
ProductB
ProductF -> ProductB
ProductC

如您所见,属于另一个产品的产品必须位于它的正下方。所有数据必须属于一个列表(没有嵌套集合),因为我只需要在一个网格中显示数据。

如果我引入一个新的属性 ReferenceProductId,即指向另一个产品,那么我解决了“归属”的问题,但我无法找到如何对它们进行排序的方法。最简单的方法是,如果我可以说 ProductA 属于 ProductA,但如果我没记错的话,那是不可能的。此外,当我将一种产品分配给另一种产品时,我不能这样做:

product.ReferenceProductId = anotherProduct.Id

我需要自己分配一个引用,因为我正在使用身份主键,所以新记录的 Id 将为 0。

product.ReferenceProduct = anotherProduct;

你在这里有什么想法?我可以让它正确保存数据,但我不能让它以上述排序顺序加载它们。

4

1 回答 1

2

您可以创建一个自定义比较器来排序您的列表。这只是一个示例,但它使用了比较 Id 和参考 Id,这使我能够实现您在上面想要的结果,假设在没有产品参考时 referenceId 为空。如果 FK 没有通过调用更新,您可以更改代码product.Reference.Id,但为简单起见,我忽略了这一点。

我的产品类别:

    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int? ReferenceId { get; set; }
    }

比较器:

public class ProductComparer : IComparer<Product>
{
    public int Compare(Product product, Product other)
    {
        if (product.ReferenceId == null && other.ReferenceId == null)
            return product.Id.CompareTo(other.Id);

        if (product.ReferenceId == null && other.ReferenceId != null)
            return product.Id.CompareTo(other.ReferenceId);

        if (product.ReferenceId != null && other.ReferenceId == null)
            return ((int) product.ReferenceId).CompareTo(other.Id);

        if (product.ReferenceId == other.ReferenceId)
            return product.Id.CompareTo(other.Id);

        return ((int) product.ReferenceId).CompareTo((int) other.ReferenceId);
    }
}

然后你会用这样的方式调用你的集合:

products.OrderBy(p => p, new ProductComparer());
于 2012-08-15T15:41:56.023 回答