如何使用dbContext构建动态WHERE子句

时间:2012-10-11 13:06:37

标签: .net entity-framework dbcontext entity-sql

我们需要根据用户输入创建动态WHERE子句。 使用旧版ObjectContext,我们通过.Where(<ESql>)找到了一种方法。

Dim qry As ObjectQuery(Of MESSGROESSE) = _objContext.MESSGROESSE
If Not String.IsNullOrWhiteSpace(fltFormelzeichen.Text) Then
    qry = qry.Where("it.Formelzeichen LIKE @Formelzeichen", New ObjectParameter("Formelzeichen", BuildESqlWildCard(fltFormelzeichen.Text)))
End If
If Not String.IsNullOrWhiteSpace(fltBezeichnung.Text) Then
    qry = qry.Where("it.Bezeichnung LIKE @Bezeichnung", New ObjectParameter("Bezeichnung", BuildESqlWildCard(fltBezeichnung.Text)))
End If

因为这是一个新项目,我们通常会使用新的DbContext。我知道如何从DbContext获取ObjectContext:

Private _objContext As ObjectContext = CType(_dbContext, IObjectContextAdapter).ObjectContext

但接着是什么?

使用DbContext.Database.SqlQueryObjectContext.CreateQuery似乎不是一个选项,因为EDMX生成器会破坏列名称,如果它们与表名相同,并且我们无法控制数据库模式。请参阅How to stop the EDMX generator from changing columns names

我们不希望依赖开源解决方案。

ADDED

与此同时,我讨论了客户不需要通配符,因此我们可以将Contains()与dbConctext一起使用:

_dbc = New TPTEntities
Dim qry As DbQuery(Of MESSGROESSE) = _dbc.MESSGROESSE
qry = From e In _dbc.MESSGROESSE Take maxRows

If Not String.IsNullOrWhiteSpace(fltFormelzeichen.Text) Then
    qry = From e In qry Where e.FORMELZEICHEN.Contains(fltFormelzeichen.Text)
End If
If Not String.IsNullOrWhiteSpace(fltBezeichnung.Text) Then
    qry = From e In qry Where e.BEZEICHNUNG.Contains(fltBezeichnung.Text)
End If
If Not String.IsNullOrWhiteSpace(fltReihenfolge.Text) Then
    qry = From e In qry Where e.REIHENFOLGE = fltReihenfolge.Text
End If
qry.Load()
'TODO is _dbc.MESSGROESSE.Local the correct way to get at the data here?
ucoGridEditor.grd.ItemsSource = _dbc.MESSGROESSE.Local

我仍然想知道如何在dbContext上使用ESql Where()。

1 个答案:

答案 0 :(得分:0)

DbContext构建于ObjectContext之上。您可以使用以下命令删除ObjectContext:

var objectContext = ((IObjectContextAdapter)ctx).ObjectContext;

其中ctx是您的DbContext(派生)类。

虽然有一种替代方法可以使用esql。您可以动态构建表达式树。看看这个线程EF object comparison with generic types - 代码显示了如何动态构建过滤器表达式。