按属性表达式构建LINQ to SQL组

时间:2013-09-17 12:24:08

标签: c# linq linq-to-sql lambda expression

我正在尝试动态使用GroupBy,我知道这对于LINQ to SQL来说是一个很大的禁忌,但我认为这可能会有效。我只需要一些表达式语法的帮助。

采取这个简单的例子:

var grouped = from c in ctx.Customers
              group c by c.LastName into Group
              select Group;

我希望能够按名字或姓氏进行分组,具体取决于用户的偏好。现在我明白LINQ必须在这里建立一个SQL兼容的表达式,但我只是想换掉它将用来构建最终SQL命令的属性。

所以我一直在试验像:

private Expression<Func<Customer, TKey>> GetColumn<TKey>(Customer c, 
  GroupingType g)
{
    if(g == GroupingType.First)
        var e = Expression<Func<Customer, string>> l = () => c.FirstName; //Here
    // etc...
}

var groupingType = GroupingType.First;

var grouped = from c in ctx.Customers
              group c by GetColumn<string>(c, groupingType) into Group
              select Group;

在我迷失在表情的海洋中并引用之前,有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

试试这个:

bool byLastName = true;

Expression<Func<Customer, string>> exp;

if (byLastName)
{
    exp = p => p.LastName;
}
else
{
    exp = p => p.FirstName;
}

var grouped = ctx.Customers.GroupBy(exp);

有时LINQ的功能语法比from... select...语法更容易使用。这里使用Expression<Func<Customer, string>>是明确的。