如何将 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()