如何将 ObjectQuery 与由 OR 子句分隔的 Where 过滤器一起使用

Posted

技术标签:

【中文标题】如何将 ObjectQuery 与由 OR 子句分隔的 Where 过滤器一起使用【英文标题】:How to use ObjectQuery with Where filter separated by OR clause 【发布时间】:2011-04-17 00:06:54 【问题描述】:

有人可以帮我回答如何用 ObjectQuery bilder 重写原始 SQL 过滤器 WHERE (...) OR (...) 吗?

String queryRaw = "SELECT ls.LocaleName, ls.IsActive, ls.LocaleDescription " +
                  "FROM RoutesEntities.Locales AS ls ";

                  //" WHERE ls.LocaleName = 'en' OR ls.LocaleName = 'de' "

this._queryData = new ObjectQuery<DbDataRecord>(queryRaw, routesModel);

我会使用 Where() 方法,但它会生成由 AND 分隔的 where 子句,尽管我想使用 OR 代替。 QueryBilder 可以吗? 我的意思是如何使用它来生成“或分隔”过滤器:

Where("it.LocaleName IN (@localeName)", new ObjectParameter("localeName", String.Join(",", localeName)))

谢谢,阿尔乔姆

【问题讨论】:

【参考方案1】:

这又发生了,我自己回答我的问题。谢谢你。

这是答案:

ObjectQuery as EntityCommand DO NOT SUPPORT "IN" CLAUSE YET ...这意味着在您使用已从 DB 中选择的 DataSet 之前,没有机会使用 WHERE IN 过滤器将查询发送到 DB。所以只有 LINQ 方法可以做到这一点,而且只有选定的 List

虽然,有一个替代方案不是那么清晰但有效 - 您可以在查询中使用多个 OR 条件,它们对我来说很好:

ObjectQuery<DbDataRecord> query = query.Where("it.RouteID=1 OR it.RouteID=2");

希望这会帮助某人......享受:)

【讨论】:

【参考方案2】:

您可以在 ObjectQuery 中使用 IN 子句。您只需要使用 而不是 (.

例如“it.ID IN 4,5,6”而不是“it.ID IN (4,5,6)”

这个答案的所有功劳来自 'Contains()' workaround using Linq to Entities?

【讨论】:

【参考方案3】:

ObjectQuery as EntityCommand SUPPORT "IN" CLAUSE. The syntex is

ObjectQuery<SampleProduct> s = db.SampleProducts;
s.Name = "SampleProductName";
string strIDList = "10,20,30";
s= s.Where("SampleProductName.ID IN " + strIDList + "");

【讨论】:

【参考方案4】:

ObjectQuery as EntityCommand 支持“IN”子句。

ObjectQuery 的逻辑运算符:

ObjectQuery 允许您将多个 where 条件连接在一起。

默认情况下,使用 AND 参数组合条件。 要在条件之间放置 OR 运算符,请在给定的 Where 方法之间调用 Or() 方法。 如果您希望条件代码更清晰易读,也可以显式调用 And() 方法。

Ex: // 检索名字为“Joe”或姓氏为“Smith”的用户。

var whereQuery = UserInfoProvider.GetUsers()

.Where("FirstName", QueryOperator.Equals, "Joe")
.Or()
.Where("LastName", QueryOperator.Equals, "Smith");

参考更多:https://docs.kentico.com/display/K82/Retrieving+database+data+using+ObjectQuery+API

【讨论】:

以上是关于如何将 ObjectQuery 与由 OR 子句分隔的 Where 过滤器一起使用的主要内容,如果未能解决你的问题,请参考以下文章

无法将匿名类型从“System.Linq.IQueryable”转换为“System.Data.Entity.Core.Objects.ObjectQuery”

ObjectQuery.Include() => ObjectQuery.IncludeAll()

ObjectQuery查询及方法

ObjectQuery查询及方法

更新对象时键入 ObjectQuery 或 DbQuery 错误

不能使用“System.Data.Entity.Core.Objects.ObjectQuery”类型的实例调用