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

C# 从不同表中获取记录的通用查询,c#,C#,在我们的项目中,我们使用LINQtoEntities连接到数据库。要从表1中读取有效记录,可以使用以下方法: public List<tableName> GetTableNameRecords() { try { return (from x in _context.tableName where x.valid == 1 select x).ToList(); } catch (Exc

在我们的项目中,我们使用LINQtoEntities连接到数据库。要从表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);
}
}
公共列表GetTableNameRecords() { 尝试 { 返回(从x在_context.tableName中) 其中x.valid==1 选择x).ToList(); } 捕获(例外情况除外) { 抛出新异常(例如消息); } } 它可以工作,但有一个问题-对于每个表,我们需要编写相同的查询,只需更改表名。有没有一种方法可以编写只能传递表名的泛型方法?比如:

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);
}
}
公共列表GetRecords()
{
尝试
{
返回(在_上下文中从x返回)。
其中x.valid==1
选择x).ToList();
}
捕获(例外情况除外)
{
抛出新异常(例如消息);
}
}

感谢您的帮助

您可以使用反射来实现这一点,但您将面临一些相当丑陋的代码。然而,如果你愿意稍微改变一下你的模型,你可以用一种相对简单的方式

创建一个具有一个属性-
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()
}
List GetValid(DbContext上下文),其中T:IValid
{
返回context.Set().Where(x=>x.valid).ToList()
}

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

这里有一个使用反射的扩展

    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();