相关疑难解决方法(0)

C#,Linq2Sql:是否可以将两个可查询连接成一个?

我有一个可查询的,我已经使用各种WhereWhereBetween语句来缩小收集到一组特定的.现在我需要添加一种Where || WhereBetween.换句话说,我不能像现在一样把它们连在一起,因为它可以作为一个And.那么,我该怎么做呢?

我看到两种可能性:

  1. 从我拥有的一个查询中创建两个查询,一个使用Where,一个使用WhereBetween.然后将它们连接起来.不知道这是否可能?此外,虽然不是在我的特定情况下,你很可能最终会重复...
  2. 以某种方式合并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)

c# lambda iqueryable expression-trees linq-to-sql

11
推荐指数
1
解决办法
3923
查看次数

将IQueryable <T> Where()扩展为OR而不是AND关系

我正在使用我自己的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# iqueryable

8
推荐指数
2
解决办法
4962
查看次数

LinQ查询 - 动态添加位置

我很难解决这个问题,需要在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)

linq

2
推荐指数
1
解决办法
5883
查看次数

删除Linq查询中的WHERE子句

我有一个包含许多位列的产品信息表.可以从具有每列复选框的界面查询此表.复选框分为几个相关组.

例如,其中三列描述了产品适用于各种市场,包括汽车,航空和海运.

如果没有选中这些复选框,我希望执行以下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#,如果要分支到不同的查询.

c# linq linq-to-sql

2
推荐指数
1
解决办法
1245
查看次数

标签 统计

c# ×3

iqueryable ×2

linq ×2

linq-to-sql ×2

expression-trees ×1

lambda ×1