我不是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#的天真,并且感谢所有回复的人。非常感谢。
答案 0 :(得分:0)
您不会发布大量代码,但如果您只是尝试使用表达式来动态添加您不需要的条件。你可以这样做:
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))
答案 1 :(得分:0)
需要使用System.Linq.Dynamic NuGet relation
样品:
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;
}