使用 Lambda 表达式查找具有匹配 ID 的所有对象

Use Lambda expression to find all objects with matching id

我是第一次使用 Lambda 表达式,并试图了解如何执行此操作。我正在遵循此测试文件中已存在的模式,但我的调用有一层额外的复杂性,因为我需要查看每个对象内部 select 所有具有将提供的 id 的对象测试的时间。

myobject.cs

public class myObject
{
    public myObject()
    {
        this.id = Guid.Empty;
        this.poolId = Guid.Empty;
        this.name = string.Empty;
        this.URL = string.Empty;
    }

    public Guid id { get; set; }
    public Guid poolId { get; set; }
    public string name { get; set; }
    public string URL { get; set; }

}

testfile.cs

Mock<IMyObjectRepository> mock = new Mock<IMyObjectRepository>(MockBehavior.Strict);

List<myObject> objects = new List<myObject>();

mock.Setup(r => r.LoadByPoolId(It.IsAny<Guid>()))
    .Returns<IEnumerable<myObject>>(objList => objects.Where(obj => objList.Contains(obj.id));

问题是,这只搜索表面级别的对象,不搜索对象的属性。 select 所有 myObjects 具有匹配 ID 的部分是什么?

存储库界面

public interface IMyObjectRepository
{
    void Put(myObject object)
    void Delete(Guid appId);
    myObject Load(Guid appId)
    IEnumerable<myObject> LoadByPoolId(Guid poolId);
}

LINQ 的 Where 方法接受 lambda 表达式,允许您执行任何您希望的检查。编写一个表达式,对您希望包含的行求值为 true,否则为 false。

在你的情况下,表达式将是 o.id == targetGUID 所以只需将它插入 lambda 主体:

var filteredList = list.Where(o => o.id == targetGUID);

使用提供的示例

var mock = new Mock<IMyObjectRepository>();

var objects = new List<myObject>();
//...populate objects

// access invocation arguments when returning a value
mock.Setup(r => r.LoadByPoolId(It.IsAny<Guid>()))
    .Returns((Guid arg) => objects.Where(obj => obj.poolId == arg));

Returns 表达式中,提供的参数被传递给用于过滤 objects 列表的表达式。

参考:Moq Quickstart