在Linq查询中执行代码块的语法?

Sha*_*ica 14 c# linq

这里有一些代码(显然)无法编译:

var q = from x in myAnonymousTypeCollection
        select new {
          x.ID,
          CalcField = { 
                        switch(x.SomeField) {
                          case 1:
                            return Math.Sqrt(x.Field1);
                          case 2:
                            return Math.Pow(x.Field2, 2);
                          default:
                            return x.Field3;
                        }
                      }
        };
Run Code Online (Sandbox Code Playgroud)

你得到了照片; 我试图以CalcField完全不同的方式计算,具体取决于价值SomeField.我不能使用Func<>(或者我可以?),因为输入类型是匿名的.那么什么是正确的语法来实现这一点?

cad*_*ll0 12

首先,我通常更喜欢方法链语法而不是Linq的查询语法.有了它,你可以轻松地做到这一点.

var q = myAnonymousTypeCollection
    .Select(x => 
            {
                object calcField; 

                 switch(x.SomeField) 
                 {
                      case 1:
                        calcField = Math.Sqrt(x.Field1);
                      case 2:
                        calcField =  Math.Pow(x.Field2, 2);
                      default:
                        calcField = x.Field3;

                 return new 
                        {
                            x.ID,
                            CalcField = calcField
                        };
            });
Run Code Online (Sandbox Code Playgroud)

不使用方法链,您需要方法或Func.我们假设一个Func

//replace these with actual types if you can.
Func<dynamic, dynamic> calculateField = 
    x => 
    {
        switch(x.SomeField) {
            case 1:
                return Math.Sqrt(x.Field1);
            case 2:
                return Math.Pow(x.Field2, 2);
            default:
                return x.Field3;
    }

var q = from x in myAnonymousTypeCollection
        select new { x.Id, CalcField = calculateField(x) };
Run Code Online (Sandbox Code Playgroud)

注意:我没有在IDE中写这个,所以请原谅任何简单的错误.

这是动态的MSDN .但是,我发现一旦你需要开始传递匿名类型,最好是创建一个实际的类.


McG*_*gle 8

您可以将匿名函数包装为(自执行)Func<>委托.这假设您知道返回类型.

var q = from x in myAnonymousTypeCollection
    select new {
      ID = x.ID,
      CalcField = new Func<double>( () => { 
                    switch(x.SomeField) {
                      case 1:
                        return Math.Sqrt(x.Field1);
                      case 2:
                        return Math.Pow(x.Field2, 2);
                      default:
                        return x.Field3;
                    }
                  } )()
    };
Run Code Online (Sandbox Code Playgroud)