1

我们需要根据用户输入创建动态 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)))
万一
If Not String.IsNullOrWhiteSpace(fltBezeichnung.Text) Then
    qry = qry.Where("it.Bezeichnung LIKE @Bezeichnung", New ObjectParameter("Bezeichnung", BuildESqlWildCard(fltBezeichnung.Text)))
万一

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

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

但是然后呢?

使用DbContext.Database.SqlQueryorObjectContext.CreateQuery似乎不是一个选项,因为 EDMX 生成器会破坏列名,如果它们与表名相同并且我们无法控制 DB 模式。请参阅如何阻止 EDMX 生成器更改列名

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

添加

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

_dbc = 新的 TPTEntities
Dim qry As DbQuery(Of MESSGROESSE) = _dbc.MESSGROESSE
qry = 从 e In _dbc.MESSGROESSE 取 maxRows

If Not String.IsNullOrWhiteSpace(fltFormelzeichen.Text) Then
    qry = From e In qry Where e.FORMELZEICHEN.Contains(fltFormelzeichen.Text)
万一
If Not String.IsNullOrWhiteSpace(fltBezeichnung.Text) Then
    qry = 来自 e In qry 其中 e.BEZEICHNUNG.Contains(fltBezeichnung.Text)
万一
If Not String.IsNullOrWhiteSpace(fltReihenfolge.Text) Then
    qry = From e In qry 其中 e.REIHENFOLGE = fltReihenfolge.Text
万一
qry.Load()
'TODO 是 _dbc.MESSGROESSE.Local 获取数据的正确方法吗?
ucoGridEditor.grd.ItemsSource = _dbc.MESSGROESSE.Local

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

4

1 回答 1

0

DbContext 建立在 ObjectContext 之上。您可以使用以下方法拖放到 ObjectContext:

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

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

不过,还有另一种使用 esql 的方法。您可以动态构建表达式树。看一下这个线程EF 对象与泛型类型的比较 - 代码显示了如何动态构建过滤器表达式。

于 2012-10-12T16:36:38.593 回答