如何利用EF和LINQ添加过滤器并动态指定表,列,过滤器和顺序

时间:2016-02-05 15:57:54

标签: c# entity-framework linq sql-server-2012

我有这样的数据库结构(所有Parent和Childs都是表),

enter image description here

我在做什么

现在我想创建临时报告页面,让用户在这些表格中选择表格和列。

当用户选择表格和列时,他们可以添加过滤器(在列表中或包含或过滤等)到列。

我将所有这些信息作为json发送到Web服务将创建,然后在Web服务中我计划使用EntityFramework来获取所需的数据集。

我已经做了什么

我能够使用存储库和UOW,数据库等创建HTML UI,Web服务,数据库层。

问题

我的意思是我可以这样做,

var result = context.ParentA.Include("Child1.SubChild1").Include(....).Where(..

但我不知道如何指定我想要的列或添加过滤器。

2 个答案:

答案 0 :(得分:0)

对于指定列名,您可以使用带有linq查询的select,如下所示:

var result = context.ParentA.Include("Child1.SubChild1").Include(....).Where(..).select(s=> new {Name = s.ParentName , SubName = s.SubChild.Name });

要添加过滤器,您需要在where子句

中定义它们
.Where(p=>p.Name.contains("someValue"))

答案 1 :(得分:0)

如果你可以创建一个可以定义过滤器的类,那么你可以创建一个IQueryable<T>添加过滤器:

class Filters
{
    public bool FilterByColumnA { get; set; }

    ...

    public bool FilterByColumnN { get; set; }


    public int FromColumnA { get; set; }

    public int ToColumnA { get; set; }

    ...

    public string FromColumnN { get; set; }

    public string ToColumnN { get; set; }
}

然后你可以构建查询:

IQueryable<Entity> query = context.Set<Entity>();

if (filters.FilterByColumnA)
    query = query.Where(e => e.ColumnA > filters.FromColumnA && e.ColumnA < filters.ToColumnA);

...

if (filters.FilterByColumnN)
    query = query.Where(e => e.ColumnN > filters.FromColumnN && e.ColumnN < filters.ToColumnN);

您可以查看this question了解详情。

要动态选择属性,您可以选择使用Include()显式加载:

DbQuery<Entity> query = context.Set<Entity>();

foreach (var prop in properties)
    query = query.Include(prop);

如果属性声明为virtual,则只有在需要值时才会将它们加载到内存中。例如,如果您使用OData,则可以从URL创建选择查询。

另一种解决方案可能是使用Expressions

但如果您真的需要动态方法,可以查看nuget package