繁体   English   中英

C#Dynamic Linq查询多个OR逻辑

[英]C# Dynamic Linq Query Multiple OR Logic

我不是C#程序员,也没有为此设计数据库,但我的任务是创建一个不知道在编译时使用哪些列的Linq查询。 试着简洁,这是我要做的事情的要点:

从前端,用户可以选择一个或多个组,并期望返回包含将填充分页表的那些用户的JSON字符串。

假设我有这些群组:

组别1

第2组

组3

组4

用户选择Group1,Group2和Group4。 他们期望从属于这些组中的任何一个的数据库用户返回。

在数据库中,这些组名称是列名。

如果我要写一个直接的SQL语句,它看起来像这样:

SELECT EmailAddress, FirstName, LastName
FROM Contacts AS C
JOIN GroupContacts AS D
ON C.ID = D.ContactId
WHERE D.DealId = 'some unique id'
AND (
        D.Group1 = 1
        OR
        D.Group2 = 1
        OR
        D.Group4 = 1
    )
ORDER BY C.LastName
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY

其中= 1表示联系人在该组中。

我希望能够做的就是使AND(...)部分动态化,具体取决于用户选择的内容。

我已经研究了如何使用C#表达式,但我遇到的函数(Expression.OrElse())只能采用两个参数。

我的方法是什么?

编辑:

这是我悲伤的C#代码:

String[] GroupNames = { "Group1", "Group2", "Group4" }; // user selected groups
List<Expression> expressionList = new List<Expression>();

foreach (String name in GroupNames)
{
    expressionList.Add(Expression.Equal(Expression.Constant(name), 1));
}

这是我真的不知道该怎么做的地方。 我想我可以编写表达式的其余部分,如果我可以让这个expressionList来评估。

我知道我将拥有有限数量的团体。 起初我尝试编写一个switch语句的解决方案:

List<Expression> expressionList = new List<Expression>();
Expression expressionOR = Expression.Empty();
Expression rightSide = Expression.Constant(true, typeof(bool));

foreach (string name in GroupNames)
{
    switch (name)
    {
        case "Group1":
            leftSide = Expression.Constant("Group1");
            e1 = Expression.Equal(leftSide, rightSide);
            break;

        case "Group2":
            leftSide = Expression.Constant("Group2");
            e2 = Expression.Equal(leftSide, rightSide);
            break;

        case "Group3":
            leftSide = Expression.Constant("Group3");
            e3 = Expression.Equal(leftSide, rightSide);
            break;

        case "Group4":
            leftSide = Expression.Constant("Group4");
            e4 = Expression.Equal(leftSide, rightSide);
            break;
    }

    expressionOR = Expression.Equal(leftSide, rightSide);
    expressionList.Add(expressionOR);
}

然后我会尝试使用Expression.OrElse(expressionList); 在某种程度上。

请原谅我对C#的天真,并感谢所有回复的人。 非常感谢。

您不会发布大量代码,但如果您只是尝试使用表达式来动态添加您不需要的条件。 你可以这样做:

where DealId == "some unique id" 
   && ((GroupNames.Contains("Group1") && Group1 = 1) || 
       (GroupNames.Contains("Group2") && Group2 = 1) || 
       (GroupNames.Contains("Group3") && Group3 = 1) || 
       (GroupNames.Contains("Group4") && Group4 = 1))

需要使用System.Linq.Dynamic NuGet关系

样品:

var gropString = String.Format("new ({0})", GroupDocumentByFields().ToSeparatedString());
var groupping = list1.AsQueryable().GroupBy(gropString, "it");
foreach (IGrouping<dynamic, ITAP.Database.OrderItems> items in groupping) {
     var idorders = items.Select(p => p.IDOrder).Distinct().ToList();
     var goods = listGoods.Where(p => idorders.Contains(p.IDOrder));
     var services = listServices.Where(p => idorders.Contains(p.IDOrder));

...

 protected List<string> GroupDocumentItemsByFields() {
        var fields = new List<string>();
        if (GetNameVariant == Selling.GetNameVariant.OrderItemsName)
            fields.Add("Name as ItemName");
        if (GetNameVariant == Selling.GetNameVariant.OrderItemsShortName)
            fields.Add("ShortName as ItemName");
        if (GetNameVariant == Selling.GetNameVariant.SellingName)
            fields.Add("SellingName as ItemName");

        if(this.PriceVariant == Selling.PriceVariant.PriceWithoutNDS)
            fields.Add("PriceWithoutNDS as Price");
        if (this.PriceVariant == Selling.PriceVariant.Price)
            fields.Add("Price as Price");

        return fields;            
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM