gpt4 book ai didi

c# - FluentValidation 检查子集合中的重复实体

转载 作者:太空狗 更新时间:2023-10-30 01:17:48 25 4
gpt4 key购买 nike

我有一个 MainEntity 类,它有一个 SubEntity 的集合。以下是目前的验证:

public class MainEntityValidator : AbstractValidator<MainEntity>
{
public MainEntityValidator()
{
RuleFor(x => x.SubEntities).SetCollectionValidator(new SubEntityValidator());
}

public class SubEntityValidator : AbstractValidator<SubEntity>
{
public SubEntityValidator()
{
RuleFor(x => x.Field1).NotNull();
RuleFor(x => x.Field2).NotNull();
}
}
}

如何添加验证规则,以便只有唯一的 SubEntity 对象(基于 Field1Field2)必须在集合中?

最佳答案

如果您需要将验证规则应用于集合属性,但仍需要访问主模型和(或)整个集合,而不仅仅是要验证的项目,那么 RuleForEach 方法是您的选择:

var comparer = new SubEntityComparer();

RuleForEach(x => x.SubEntities)
.Must((model, submodel) => model.SubEntities.Count(xsub => comparer.Equals(xsub, submodel)) == 1) // one match that ReferenceEquals hit
.WithMessage("The item with values {0}, {1} has duplicates in collection of {2} items",
(model, submodel) => submodel.Field1,
(model, submodel) => submodel.Field2,
(model, submodel) => model.SubEntities.Count); // in validation message generation you can access to current item as well as to main model

如果您只需要一条错误消息来验证您描述的规则——您可以将简单的谓词规则应用于集合属性 SubEntites:

RuleFor(x => x.SubEntities)
.Must(coll => coll.Distinct(new SubEntityComparer()).Count() == coll.Count)
.WithMessage("One or more items in collection of {0} items are duplicates",
(model, coll) => coll.Count); // has access to collection and to main model

在这两种情况下,我都使用相同的相等比较器,但您也可以覆盖 Equals 方法,并使用带重载的 IEnumerable 扩展方法的重载,排除 EqualityComparer 参数。

EqualityComparer 代码如下:

public class SubEntityComparer : IEqualityComparer<SubEntity>
{
public bool Equals(SubEntity x, SubEntity y)
{
if (x == null ^ y == null)
return false;

if (ReferenceEquals(x, y))
return true;

// your equality comparison logic goes here:
return x.Field1 == y.Field1 &&
x.Field2 == y.Field2;
}

public int GetHashCode(SubEntity obj)
{
return obj.Field1.GetHashCode() + 37 * obj.Field2.GetHashCode();
}
}

更新:

在这两种实现集合验证的方法中,您仍然可以使用 SetCollectionValidator(new SubEntityValidator()) 通过简单的规则独立验证每个项目。

关于c# - FluentValidation 检查子集合中的重复实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30333421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com