我有一个可查询的,我已经使用各种Where和WhereBetween语句来缩小收集到一组特定的.现在我需要添加一种Where || WhereBetween.换句话说,我不能像现在一样把它们连在一起,因为它可以作为一个And.那么,我该怎么做呢?
我看到两种可能性:
Where,一个使用WhereBetween.然后将它们连接起来.不知道这是否可能?此外,虽然不是在我的特定情况下,你很可能最终会重复...Where表达式和在WhereBetween某种Or中创建的表达式.首先,如上所述,我不确定是否可能.如果是的话,我不太确定这是一个很好的方法.
第二,我可以看到一个选项,但不完全确定所有的细节.以下是WhereBetween我的另一个问题的方法,我现在使用它并且效果很好:
public static IQueryable<TSource> WhereBetween<TSource, TValue>(
this IQueryable<TSource> source,
Expression<Func<TSource, TValue>> selector,
IEnumerable<Range<TValue>> ranges)
{
var param = Expression.Parameter(typeof(TSource), "x");
var member = Expression.Invoke(selector, param);
Expression body = null;
foreach (var range in ranges)
{
var filter = Expression.AndAlso(
Expression.GreaterThanOrEqual(member,
Expression.Constant(range.A, typeof(TValue))),
Expression.LessThanOrEqual(member,
Expression.Constant(range.B, typeof(TValue))));
body = body …Run Code Online (Sandbox Code Playgroud) 我正在使用我自己的IQueryable <>扩展方法来创建可链接查询,例如FindAll().FindInZip(12345).NameStartsWith("XYZ").OrderByHowIWantIt()等然后在延迟执行时创建基于我的单个查询扩展方法链.
但问题是,扩展链中的所有位置(FindXYZ,FindInZip等)将始终组合为AND,这意味着我无法做到这样的事情:
FindAll().FirstNameStartsWith("X").OrLastNameStartsWith("Z")因为我不知道如何在一个单独的Where方法中注入OR.
知道如何解决这个问题吗?
额外; 到目前为止,我理解如何将表达式链接为或者如果我将它们包装起来(例如CompileAsOr(FirstNameStartsWith("A").LastNameStartsWith("Z").OrderBy(..))
我想要做的虽然稍微复杂一点(并且PredicateBuilder在这里没有帮助......)因为我希望以后的IQueryable能够基本上访问先前建立的Where条件,而不必将它们包装起来以创建Or之间他们.
当每个扩展方法返回IQueryable <>时,我理解它应该知道某个地方的查询条件的当前状态,这使我相信应该有一些自动化的方法或在所有先前的Where条件中创建Or而不必包装你想要什么或者.
我很难解决这个问题,需要在C#,asp.net中创建动态linq查询的代码.我有5个下拉列表,它搜索同一数据库表中的不同列,并将项目筛选值返回到单个列表框.问题是没有序列在DDL中选择了哪个或全部或任何一个,但组合的过滤结果应显示在列表框中.我有一个工作查询,分别在每个DDL选择中一次搜索并返回结果.必须在AND中添加where子句以动态地向此查询添加其他DDL选择.谢谢
public ListItemCollection searchProject(ListItemCollection projList, String searchstr, String columnName)
{
DataSet DSToReturn = new DataSet();
ListItemCollection returnItems = new ListItemCollection();
DataTable results = (from d in ((DataSet)_MyDataset).Tables["Records"].AsEnumerable()
orderby d.Field<string>("Name") ascending
where (d.Field<string>(columnName) != null)
where d[columnName].ToString().ToLower().Contains(searchstr.ToLower())
select d).CopyToDataTable();
foreach (ListItem li in projList)
{
if ((from System.Data.DataRow row in results.Rows
where li.Value.Equals(row["value"].ToString(), StringComparison.InvariantCultureIgnoreCase)
select row["value"]).Count() > 0)
returnItems.Add(li);
}
return returnItems;
}
Run Code Online (Sandbox Code Playgroud) 我有一个包含许多位列的产品信息表.可以从具有每列复选框的界面查询此表.复选框分为几个相关组.
例如,其中三列描述了产品适用于各种市场,包括汽车,航空和海运.
如果没有选中这些复选框,我希望执行以下SQL.
SELECT * FROM Products
Run Code Online (Sandbox Code Playgroud)
如果检查了Automotive,则应执行以下SQL
SELECT * FROM Products WHERE Automotive = 1
Run Code Online (Sandbox Code Playgroud)
如果检查了多个,我希望选项一起进行OR运算
SELECT * FROM Products WHERE
Automotive = 1
OR
Aviation = 1
Run Code Online (Sandbox Code Playgroud)
在古老的C#和SQL中,我可以通过有条件地将SQL结合在一起来实现这个逻辑,但是我在使用Linq生成相同的逻辑时遇到了麻烦.
我的问题是如何有条件地将WHERE子句及其元素添加到我的查询中.
我更喜欢只有一个点执行查询,所以,如果可能的话,我想避免使用C#,如果要分支到不同的查询.