c# - 在动态 linq 查询中使用变量

标签 c# linq dynamic-linq

我正在使用 Linq to Entities 并添加了 using System.Linq.Dynamic; 的 using stmt 我的目标是将 whereClause 变量传递到 emailList 查询中(参见屏幕截图)。

有什么想法吗?

Error message details

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
在使用了@Michael 的建议后,我得到了它的工作原理:

HTML(注意我将字段值放在“值”属性中):

<asp:CheckBoxList ID="_checkboxGroups" runat="Server">
                            <asp:ListItem Text="Sid Dickens Lovers" Value="SidDickens_TF" Selected="False" />
                            <asp:ListItem Text="Rosamond Lover" Value="Rosamond_TF" Selected="false" />
                            <asp:ListItem Text="Wine and Cheese Lovers" Value="WineAndCheese_TF" Selected="false" />
                            <asp:ListItem Text="Good Clients" Value="IntDesign_TF" Selected="false" />
                            <asp:ListItem Text="Vendors" Value="Vendor_TF" Selected="false" />
                        </asp:CheckBoxList>

代码隐藏:

// determine # of items in asp:CheckBoxList
        var groupCount = _checkboxGroups.Items.Count;

        var conditions = new List<string>();

        for (int i = 0; i < groupCount; i++)
        {
            if (_checkboxGroups.Items[i].Selected)
            {
                conditions.Add(_checkboxGroups.Items[i].Value.ToString() + " == true");
            }
        }

        string whereClause = string.Join(" OR ", conditions.ToArray());


        ElanEntities3 db = new ElanEntities3();

        var emailList = (from c in db.vEmailListViewforSendings
                         orderby c.Email
                         select c).AsQueryable();

        emailList = emailList.Where(whereClause);

       _listViewClients.DataSource = emailList;

最佳答案

您需要将与参数匹配的对象传递给IQueryable.Where( predicate )

所以 whereClause 必须是这种类型的对象:

Expression<Func<TSource, bool>>

因为您对 where 子句进行 OR 运算而不是对它们进行 AND 运算,所以您将不得不构建一个大的 where 子句。

假设您的数据对象是 OBJ 类型并且它具有 bool 属性 P0 和 P1:

bool filterP0 = _checkboxGroups[0].Selected;
bool filterP1 = _checkboxGroups[1].Selected;

Expression<Func<OBJ, bool>> predicate = o =>
(
    ( !filterP0 && !filterP1 )
    ||
    ( filterP0 && o.P0 )
    ||
    ( filterP1 && o.P1 )
);

var emailList =
    db.vEmailListViewForSendings
        .Where( predicate )
        .OrderBy( o => o.ID );

无论如何,这就是要点。


或者,如果您真的必须动态构建谓词,您可以使用 Joe Albahari's Predicate Builder .

关于c# - 在动态 linq 查询中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10396960/

相关文章:

c# - OUTPUT INSERTED Id/SCOPE_IDENTITY() 在 C# (ASP.NET Core Razor Pages) SQL 查询中返回 null,在 SQL Server Management Studio 中工作正常

c# - 有没有办法在 C# 中获取两组对象之间的差异

c# - 动态 Linq - 在运行时设置 orderby 表达式类型

c# - foreach,额外的条件语句

c# - 重载圆圈组件

c# - 为什么我的简单 lidgren 客户端使用这么多内存?

c# - 如何逐步构建 LINQ => SQL/entities 查询(带联接)?

vb.net - vb.net 中的 lambda 表达式

c# - 是否可以通过 Dynamic LINQ 进行注入(inject)?

c# - 将第二组按键字段添加到现有的 Lambda 表达式