使用LINQ通常查找项属性值相等的任何项

时间:2016-12-09 21:10:48

标签: c# linq generics reflection

我试图实现一个通用的存储库模式,该模式在IEnumerable中实现泛型项的CRUD操作。我一直在寻找可能已经在IEnumerable中的项目。我需要以编程方式传递哪些属性构成了“键”。或者使用不同的记录,然后使用LINQ对已定义的属性执行Enumerable.Any(),以便查看该对象是否已存在于IEnumberable中。到目前为止,这是我的代码。

import json
import numpy as np

json_input = '{"rings" : [[[-8081441.0, 5685214.0], [-8081446.0, 5685216.0], [-8081442.0, 5685219.0], [-8081440.0, 5685211.0], [-8081441.0, 5685214.0]]]}'

dict = json.loads(json_input)
numpy_2d_arrays = [np.array(ring) for ring in dict["rings"]]

注意:键可以是对象MyObject

上的任何属性

2 个答案:

答案 0 :(得分:1)

您可以使您的实体从公共接口继承:

public interface IEntity
{
    int ID { get; set; }
}

然后你可以重新定义你的方法,如

public void AddItem<TEntity>(TEntity entity) where TEntity : IEntity
{
    // Now you can access entity.ID
}

现在,如果您不想总是通过ID进行比较,那么您可以在方法中添加谓词:

public void AddItem<TEntity>(TEntity entity, Func<TEntity, bool> predicate)
{
    var objects = GetAllItems().ToList();

    // You might need some logic in the predicate to check for null
    if(!objects.Any(a => predicate(a as TEntity))
    {
        objects.Add(entity);
        _cache.AddReplaceCache(objects);
    }

}

然后你将使用你的函数

repository.AddItem(entity, e => e.ID == entity.ID && e.OtherProperty == entity.OtherProperty);

答案 1 :(得分:0)

如果我理解正确您的问题TEntity没有财产ID。因此,让您的实体继承具有例如ID列的公共接口。

public interface IObject
{
    int ID {get; set;}

    //define all other properties which are shared between your Entities.
}
public class MyObject : IObject
{
    public int ID {get; set;}

    //other properties.
}

public void AddItem(TEntity item): where TEntity:IObject
{
    var entities = GetAllItems().ToList(); //Method gets cached IEnumerable<TEntity>

    if(!objects.Any(a=> a.ID == item.ID ))//Generically see if TEntity is already in the list based of defined properties
    {
        entities.Add(item);
    }

}