C# 在.NET中使用select的动态linq表达式
我想动态添加.Select语句,但编译器只允许我在当前范围内生成这些语句。我知道linqkit可能是一个解决方案,但我不想添加任何外部功能。如何避免我现在遇到的代码重复:C# 在.NET中使用select的动态linq表达式,c#,.net,linq,lambda,dynamic-linq,C#,.net,Linq,Lambda,Dynamic Linq,我想动态添加.Select语句,但编译器只允许我在当前范围内生成这些语句。我知道linqkit可能是一个解决方案,但我不想添加任何外部功能。如何避免我现在遇到的代码重复: if (request.Equals("some text")) { var filter = commonFilter.GroupBy(x => new { x.Timestamp.Year,
if (request.Equals("some text"))
{
var filter = commonFilter.GroupBy(x => new
{
x.Timestamp.Year,
x.Timestamp.Month,
})
.Select(g => new
{
Year = g.Key.Year,
Month = g.Key.Month,
TotErr = g.Count(),
column1 = g.Sum(o => o.Process.Contains("something") ? 1 : 0),
column2= g.Sum(o => o.Process.Contains(".something1") ? 1 : 0),
column3= g.Sum(o => o.Process.Contains(".something2") ? 1 : 0),
column4= g.Sum(o => o.Process.Contains("something3") ? 1 : 0),
column5= g.Sum(o => o.Process.Contains(".something4") ? 1 : 0),
column6 = g.Sum(o => o.Process.Contains(".something5") ? 1 : 0),
column7= g.Sum(o => o.Process.Contains(".something6") ? 1 : 0),
column8= g.Sum(o => o.Process.Contains(".something7") ? 1 : 0),
column9= g.Sum(o => o.Process.Contains(".something8") ? 1 : 0),
NumOrgs = g.Select(l => l.OrganizationId).Distinct().Count(),
NumUsers = g.Select(l => l.UserId).Distinct().Count(),
});
return filter.AsPa......;//not important right now
}
//Same thing again but slightly different
else if (request.Equals("some other text"))
{
var filter = commonFilter.GroupBy(x => new
{
x.Timestamp.Year,
x.Timestamp.Month,
x.Timestamp.Day
})
.Select(g => new
{
Year = g.Key.Year,
Month = g.Key.Month,
Day= g.Key.Day,
TotErr = g.Count(),
column1 = g.Sum(o => o.Process.Contains("something") ? 1 : 0),
column2= g.Sum(o => o.Process.Contains(".something1") ? 1 : 0),
column3= g.Sum(o => o.Process.Contains(".something2") ? 1 : 0),
column4= g.Sum(o => o.Process.Contains("something3") ? 1 : 0),
column5= g.Sum(o => o.Process.Contains(".something4") ? 1 : 0),
column6 = g.Sum(o => o.Process.Contains(".something5") ? 1 : 0),
column7= g.Sum(o => o.Process.Contains(".something6") ? 1 : 0),
column8= g.Sum(o => o.Process.Contains(".something7") ? 1 : 0),
column9= g.Sum(o => o.Process.Contains(".something8") ? 1 : 0),
NumOrgs = g.Select(l => l.OrganizationId).Distinct().Count(),
NumUsers = g.Select(l => l.UserId).Distinct().Count(),
});
return filter.AsPa......;//not important right now
}
你可以这样做
var Query = commonFilter.Select(g => new
{
Year = g.Key.Year,
Month = g.Key.Month,
Day= g.Key.Day,
TotErr = g.Count(),
column1 = g.Sum(o => o.Process.Contains("something") ? 1 : 0),
column2= g.Sum(o => o.Process.Contains(".something1") ? 1 : 0),
column3= g.Sum(o => o.Process.Contains(".something2") ? 1 : 0),
column4= g.Sum(o => o.Process.Contains("something3") ? 1 : 0),
column5= g.Sum(o => o.Process.Contains(".something4") ? 1 : 0),
column6 = g.Sum(o => o.Process.Contains(".something5") ? 1 : 0),
column7= g.Sum(o => o.Process.Contains(".something6") ? 1 : 0),
column8= g.Sum(o => o.Process.Contains(".something7") ? 1 : 0),
column9= g.Sum(o => o.Process.Contains(".something8") ? 1 : 0),
NumOrgs = g.Select(l => l.OrganizationId).Distinct().Count(),
NumUsers = g.Select(l => l.UserId).Distinct().Count(),
});
if (request.Equals("some text"))
{
var filter = Query.GroupBy(x => new
{
x.Timestamp.Year,
x.Timestamp.Month,
}) ;
}
//Same thing again but slightly different
else if (request.Equals("some other text"))
{
var filter = Query.GroupBy(x => new
{
x.Timestamp.Year,
x.Timestamp.Month,
x.Timestamp.Day
});
}
你可以这样做
var Query = commonFilter.Select(g => new
{
Year = g.Key.Year,
Month = g.Key.Month,
Day= g.Key.Day,
TotErr = g.Count(),
column1 = g.Sum(o => o.Process.Contains("something") ? 1 : 0),
column2= g.Sum(o => o.Process.Contains(".something1") ? 1 : 0),
column3= g.Sum(o => o.Process.Contains(".something2") ? 1 : 0),
column4= g.Sum(o => o.Process.Contains("something3") ? 1 : 0),
column5= g.Sum(o => o.Process.Contains(".something4") ? 1 : 0),
column6 = g.Sum(o => o.Process.Contains(".something5") ? 1 : 0),
column7= g.Sum(o => o.Process.Contains(".something6") ? 1 : 0),
column8= g.Sum(o => o.Process.Contains(".something7") ? 1 : 0),
column9= g.Sum(o => o.Process.Contains(".something8") ? 1 : 0),
NumOrgs = g.Select(l => l.OrganizationId).Distinct().Count(),
NumUsers = g.Select(l => l.UserId).Distinct().Count(),
});
if (request.Equals("some text"))
{
var filter = Query.GroupBy(x => new
{
x.Timestamp.Year,
x.Timestamp.Month,
}) ;
}
//Same thing again but slightly different
else if (request.Equals("some other text"))
{
var filter = Query.GroupBy(x => new
{
x.Timestamp.Year,
x.Timestamp.Month,
x.Timestamp.Day
});
}
如果要维护匿名类型,可以使用InternalsVisibleToAttribute允许单独的公共库使用匿名类型 我以前这样做是为了为带有EF数据源的数据网格创建一个通用过滤库,但它确实涉及到一定程度的反射,并使用generic System.Linq.expression组件构建表达式,因此这可能不值得,除非您有很多实例希望这样做 请参阅msdn信息: 及 如果选择模式更具可预测性,则可能不需要表达式部分,但在这种情况下,使用公共类而不是匿名类最终可能会更简单 编辑:“无法将匿名转换为x”类型错误表示您尚未完全/正确地摆脱匿名 在每个位置都有新的{…随便…},您正在创建一个匿名类型。如果您为每个具有正确属性的类创建类,以匹配您正在分配的属性,那么您只需更改如下内容
new {x=1,y=2}
阅读
new somenewclass() {x=1,x=2}
假设您在其他地方定义了
public class somenewclass
{
public int x {get;set;}
public int y {get;set;}
}
如果要维护匿名类型,可以使用InternalsVisibleToAttribute允许单独的公共库使用匿名类型 我以前这样做是为了为带有EF数据源的数据网格创建一个通用过滤库,但它确实涉及到一定程度的反射,并使用generic System.Linq.expression组件构建表达式,因此这可能不值得,除非您有很多实例希望这样做 请参阅msdn信息: 及 如果选择模式更具可预测性,则可能不需要表达式部分,但在这种情况下,使用公共类而不是匿名类最终可能会更简单 编辑:“无法将匿名转换为x”类型错误表示您尚未完全/正确地摆脱匿名 在每个位置都有新的{…随便…},您正在创建一个匿名类型。如果您为每个具有正确属性的类创建类,以匹配您正在分配的属性,那么您只需更改如下内容
new {x=1,y=2}
阅读
new somenewclass() {x=1,x=2}
假设您在其他地方定义了
public class somenewclass
{
public int x {get;set;}
public int y {get;set;}
}
linq查询的数据源是什么?如果是“Linq to objects”,您可以调用变量委托。我不确定是否理解您的实际问题。不能使用命名类型而不是匿名类型吗?您可以创建一个包含所有列字段的类,并创建两个构造函数或一个静态方法来从筛选器生成实例?是的,我可以使用命名类型,但我未能尝试定义它。我应该如何声明它?linq查询的数据源是什么?如果是“Linq to objects”,您可以调用变量委托。我不确定是否理解您的实际问题。不能使用命名类型而不是匿名类型吗?您可以创建一个包含所有列字段的类,并创建两个构造函数或一个静态方法来从筛选器生成实例?是的,我可以使用命名类型,但我未能尝试定义它。我该怎么申报呢?好主意,但没法用。当分组尚未声明时,您的示例中的变量查询(例如Year=g.Key.Year)如何计算?我的错,我在一个小故障中错过了这一点,但至少它可以作为一个起点,并可以进一步细化。这个主意不错,但无法使它起作用。您的示例中的变量查询,例如Year=g.Key.Year,在分组尚未声明的情况下,如何计算?我的错,我在一个小故障中错过了这一点,但至少它可以作为一个起点,并可以进一步细化。是的,我将尝试定义一个公共类。但是当我尝试创建一个类时,我收到了各种各样的错误消息,说不能隐式地从匿名类型转换到我的类这不是我想要的答案,但是你帮助我走上了正确的道路,所以我接受这个答案是的,我将尝试定义一个公共类。但是当我尝试创建一个类时,我收到了各种各样的错误消息,比如说不能隐式地从匿名类型转换到我的类这不完全是我想要的答案,但是你帮助我走上了正确的道路,所以我接受这个答案