c# - 丑陋的 LINQ 语句,更好的方法?

标签 c# .net linq linq-to-entities

我有一个 LINQ 语句,该语句将多个列的值相加,每个列都以“HH”开头,尽管还有其他列可用:

//TODO Clean up this mess
var query1 = (from e in Data
                where e.SD == date
                select e).Select(x =>   x.HH01 + x.HH16 + x.HH17 + x.HH18 + x.HH19 + x.HH20 + x.HH21 + x.HH22 + x.HH23 +
                                        x.HH24 + x.HH25 + x.HH26 + x.HH27 + x.HH28 + x.HH29 + x.HH30 + x.HH31 + x.HH32 + 
                                        x.HH33 + x.HH34 + x.HH35 + x.HH36 + x.HH37 + x.HH38 + x.HH39 + x.HH40 + x.HH41 +
                                        x.HH42 + x.HH43 + x.HH44 +x.HH45 + x.HH46 + x.HH47 + x.HH48 + x.HH49.GetValueOrDefault()+
                                        x.HH50.GetValueOrDefault());

return query1.FirstOrDefault();

有什么办法可以解决这个问题吗?我必须为此做很多变体(以不同的方法),所以如果可能的话,它会清除很多“绒毛”。

此外,我想在每一列上调用 .GetValueOrDefault(),但目前我已经将其删除,因为最后两列除外。

非常感谢您的建议!

最佳答案

我猜你可以为此使用反射:

double GetHHSum<T>(T x) where T : class
{
   double result = 0;

   var properties = typeof(T).GetProperties();
   foreach (var property in properties)
   {
       if (property.Name.StartsWith("HH"))
          sum += Convert.ToSingle(property.GetValue(x)).GetValueOrDefault();
   }

   return result;
}

然后像这样使用它:

return (from e in Data
        where e.SD == date
        select e).ToList().Select(x => GetHHSum(x)).FirstOrDefault();

代码未经测试

关于c# - 丑陋的 LINQ 语句,更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8909055/

相关文章:

c# - 如何使用 LINQ to XML 创建对象列表?

c# - 当元素不存在于使用 linq 的列表中时返回一个值

c# - 'Project1.ID' 中的未知列 'where clause'

java - 帮助从 .Net 创建 Zip 文件并从 Java 读取它们

c# - 创建通用类型的字典

.net - CREATE ASSEMBLY 失败,返回 "Unable to resolve token"

c# - Linq 获得前 9 组加上所有其他组的总和作为第 10 组

C#:在声明变量时或在构造函数内初始化变量

c# - 从数组中删除精确的子数组值

c# - 为什么在将 First() 应用于投影时此 linq 代码会呈指数级变慢?