C# 如何访问初始值设定项中的对象属性集?

C# 如何访问初始值设定项中的对象属性集?,c#,linq-to-sql,initialization,C#,Linq To Sql,Initialization,我不知道这是否可行,但我如何访问已在初始值设定项中设置的对象属性,以便使用它在同一初始值设定项中设置另一个属性 以下是我想做的: var usersWithCount = users .AsEnumerable() .Select( u => new User() { UserId = u.UserId, UserName = u.UserName

我不知道这是否可行,但我如何访问已在初始值设定项中设置的对象属性,以便使用它在同一初始值设定项中设置另一个属性

以下是我想做的:

var usersWithCount =
    users
    .AsEnumerable()
    .Select(
        u =>
        new User()
            {
                UserId = u.UserId,
                UserName = u.UserName,
                Email = u.Email,
                RelatedId = u.RelatedId,
                ReviewCount = u.Reviews.Count(r => !r.Deleted && r.Approved),
                HelpfulYesCount = u.Reviews.Where(r => !r.Deleted && r.Approved).Sum(r => r.HelpfulYes),
                HelpfulNoCount = u.Reviews.Where(r => !r.Deleted && r.Approved).Sum(r => r.HelpfulNo),
                TotalPoints = ReviewCount + HelpfulYesCount - HelpfulNoCount,
                DateCreated = u.DateCreated
            })
    .OrderByDescending(user => user.TotalPoints);
不起作用的部分是“TotalPoints=ReviewCount+HelpfulYesCount-HelpfulNoCount”。我宁愿避免再次使用“u.Reviews.Count(r=>!r.Deleted&&r.Approved)”,也不想通过循环结果将这些值相加来设置TotalPoints

如何引用初始值设定项中设置在TotalPoints属性上方的属性?是否有某种方法可以将它们设置为变量,并在设置它们的位置和尝试添加它们的位置引用它们?我是不是用完全错误的方法来处理这种情况?

我想你可以这样做

...
.Select( u => {
    var rc = u.Reviews.Count(...);
    var hyc = ...;
    ...
    return new User() { /*now reference precomputed vars rc, hyc, ...*/ };})
...
不过也许还有另一个/更好的方法。

我想你也可以

...
.Select( u => {
    var rc = u.Reviews.Count(...);
    var hyc = ...;
    ...
    return new User() { /*now reference precomputed vars rc, hyc, ...*/ };})
...

尽管可能还有另一种/更好的方法。

为什么不更改用户类的TotalPoints属性以返回计算值?e、 g

public int TotalPoints
{
  get
  {
    return ReviewCount + HelpfulYesCount - HelpfulNoCount
  }
}

为什么不更改用户类的TotalPoints属性以返回计算值?e、 g

public int TotalPoints
{
  get
  {
    return ReviewCount + HelpfulYesCount - HelpfulNoCount
  }
}

你需要两个级别。Enumerable#1用于计算基本计数,Enumerable#2(用于合并计数的返回值)。

这需要两个级别。Enumerable#1用于计算基本计数,Enumerable#2(用于合并计数的返回值)。

与Brian的答案基本相同,但使用的是查询表达式而不是扩展方法

from users.AsEnumerable()
let reviewCount = u.Reviews.Count(...)
let helpfulYesCount = u.Reviews.Count(...)
let ...
select new User
{
   ReviewCount = reviewCount,
   ...
}

基本上与Brian的答案相同,但使用的是查询表达式而不是扩展方法

from users.AsEnumerable()
let reviewCount = u.Reviews.Count(...)
let helpfulYesCount = u.Reviews.Count(...)
let ...
select new User
{
   ReviewCount = reviewCount,
   ...
}

因为用户对象是在flyOk上创建的,但是您肯定必须在某个地方为用户对象创建一个类定义?用户对象是在flyOk上创建的,但是我实际上将这些属性添加到了对象中。我尝试了这个选项,它确实起了作用,但还是决定接受Brian的建议,因为用户对象是我唯一添加了属性的对象,我可能想对我没有添加自定义属性的对象的属性执行此操作。谢谢因为用户对象是在flyOk上创建的,但是您肯定必须在某个地方为用户对象创建一个类定义?用户对象是在flyOk上创建的,但是我实际上将这些属性添加到了对象中。我尝试了这个选项,它确实起了作用,但还是决定接受Brian的建议,因为用户对象是我唯一添加了属性的对象,我可能想对我没有添加自定义属性的对象的属性执行此操作。谢谢