用于从不同表中获取记录的通用查询

时间:2014-03-24 12:42:49

标签: c#

在我们的项目中,我们使用Linq-to-Entities连接到数据库。要从中读取有效记录,请说表1有方法:

public List<tableName> GetTableNameRecords()
{
try
{
    return (from x in _context.tableName
                      where x.valid == 1
                      select x).ToList();
}
catch (Exception ex)
{
    throw new Exception(ex.Message);
}
}

它有效,但是有一个问题 - 对于每个表我们需要编写相同的查询并且只更改表名。有没有办法编写通用方法,我们只能传递表名?类似的东西:

public List<T> GetRecords<T>()
{
try
{
    return (from x in _context.<T>
                      where x.valid == 1
                      select x).ToList();
}
catch (Exception ex)
{
    throw new Exception(ex.Message);
}
}

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

你可以使用反射,但是你面对一些相当丑陋的代码。但是,如果您愿意稍微改变模型,可以通过相对简单的方式实现。

创建一个具有一个属性的接口 - valid,如下所示:

interface IValid
{
    bool valid { get; set; }
}

确保具有此有效字段的所有模型都实现该接口。然后你可以做这样的事情:

List<T> GetValid<T>(DbContext context) where T: IValid
{
    return context.Set<T>().Where(x=>x.valid).ToList()
}

通过让模型实现接口,您可以使用普通的LINQ表达式并让编译器对所有内容进行排序。

答案 1 :(得分:0)

这是一个使用反射

的扩展程序
    public static IEnumerable<T> GetRecords<T>(this IEnumerable<T> source)
    {
        //check property exists
        var temp = Activator.CreateInstance(typeof(T), new object[] { });
        if (temp.GetType().GetProperty("valid") == null)
            return source;

        return (from item in source
                let table = item.GetType()
                let property = table.GetProperty("valid")
                let value = property.GetValue(item, null)
                where (int)value == 1
                select item).ToList();
    }

之类的东西来称呼它
 int count = _context.TableName.GetRecords().Count();