创建通用方法以按不同属性检索实体

时间:2015-04-16 17:38:59

标签: c# linq entity-framework

我有两种非常相似的方法。我想根据实体的某个属性是null还是空字符串返回实体。但是,不共享实体的属性。所有属性都是字符串。

public List<Phone> GetPhones(){
    return context.Phones
                  .Where(p=> !(p.Number == null
                       || p.Number.Trim() == String.Empty))
                  .ToList();

public List<Remote> GetRemotes(){
    return context.Remotes
                  .Where(r => !(r.OEM == null
                       || r.OEM.Trim() == String.Empty))
                  .ToList();
}

是否可以创建如下方法:

public List<T> GetEntities(string property){
    return ...
}

2 个答案:

答案 0 :(得分:1)

访问字符串属性可以通过反射来完成: Get property value from string using reflection in C#

您尝试做的事情的问题是,除了要访问的属性之外,每个调用的对象的都不同。要编写通用函数,您必须提供方法的源代码以及属性名称。

更好的方法可能是编写一个辅助方法,该方法使用source和lambda表达式来获取适当的属性:

public List<T> GetListOfNonEmpties<T>(IEnumerable<T> source, Func<T, string> property)
{
    return source.Where(n => !(property(n) == null
                        || property(n).Trim() == String.Empty))
                    .ToList();
}

然后在你的其他方法中使用它:

public static List<Phone> GetPhones()
{
    return GetListOfNonEmpties(context.Phones, p => p.Number);
}

public static List<Remote> GetRemotes()
{
    return GetListOfNonEmpties(context.Remotes, r => r.OEM);
}

答案 1 :(得分:1)

是的,但以下可能是一个更好的通用解决方案:

public IQueryable<Phone> GetPhones(){
    return context.Phones
                  .Where(p=> !String.IsNullOrWhiteSpace(p.Number));
}

public IQueryable<Remote> GetRemotes(){
    return context.Remotes
                  .Where(r => !String.IsNullorWhiteSpace(r.OEM));
}

它返回IQueryable而不是List,因此如果你想对它进行进一步的限制,可以延迟执行以包含它们。一个“帮助器”函数来概括你要求的功能并不比在字符串上使用String.IsNullOrWhiteSpace函数更简洁或更简洁。假设您的上下文是数据库,特别是远程数据库,这是一个重大改进。如果你现在没有进一步的限制,你可能(可能会?)将来。