2016-02-05 21 views
3

我有數據庫的結構是這樣的(所有的家長和蔡爾茲是表)添加過濾器,並指定表,列,過濾器和秩序,如何利用EF和LINQ通過動態

enter image description here

我我做

現在我想建立專案報告頁面,這將讓這些表在用戶選擇表和列。

當用戶將選擇表和列,然後他們可以添加濾光器(爲列表或由等。包含或過濾器),以列。

我將所有這些信息爲JSON發送到Web服務將創建,然後在web服務我打算使用的EntityFramework來獲得所需的數據集。

我已經做

我能夠創建HTML界面,Web服務,與庫和UOW,數據庫等數據庫層..

問題

我的意思我可以做到這一點,

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

但我不確定我怎樣才能指定我想要的列或添加過濾器。

回答

0

指定列名的,你可以使用一個選擇你的LINQ查詢是這樣的:

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

如果屬性聲明爲虛,那麼他們將被加載到需要的價值,只有當內存。例如,如果您使用OData,則可以從url創建選擇查詢。

另一種解決方案可以使用Expressions

但如果你真的需要一個動態的方法,你可以檢查此nuget package