选择数组中的每个int

时间:2018-02-22 09:54:53

标签: c# linq linq-to-entities

我有以下Linq查询,它正常工作。

var results = accounts.Select(a => new
{
    Id = a.Id,
    Scores = _context.AccountAttributeStatistics.Where(at => at.AccountId == a.Id 
                             && at.LatestVersion && at.AttributeId == 39)
        .Select(at => new
        {
            Id = at.AttributeId,
            Percentile = at.Percentile,
            Percentage = at.CurrentPercentage,
        }).ToList()
 });

但是我现在需要为不同的AttributeId运行一个数字。我试过了:

Scores = _context.AccountAttributeStatistics.Where(at => at.AccountId == a.Id 
                 && at.LatestVersion && at.AttributeId == 39 || at.AttributeId == 40 
                 || at.AttributeId == 41 || at.AttributeId == 42)

不幸的是,这似乎忽略了at.LatestVersion并返回所有分数而不是最新的分数。

获得欲望结果的最佳方法是什么?

我曾想过使用数组并使用foreach但不确定这是如何工作的?

int[] attributeIds = {39, 40, 41, 42, 43};

Scores = _context.AccountAttributeStatistics.Where(at => at.AccountId == a.Id 
                 && at.LatestVersion && at.AttributeId == attributeIds.ForEach(x => x))

但是得到错误Only assignment, call, increment, decrement, and new object expressions can be used as a statement

不确定这是否是正确的方法,使用linq来实现这一目标?

4 个答案:

答案 0 :(得分:3)

您需要为此添加括号。正如你使用了||或者,所以它需要具有属性40,41,42的所有记录而不检查最新的记录。

 Scores = _context.AccountAttributeStatistics.Where(at => (at.AccountId == a.Id 
             && at.LatestVersion) && (at.AttributeId == 39 || at.AttributeId == 40 
             || at.AttributeId == 41 || at.AttributeId == 42))

使用:

 int[] attributeIds = {39,40,41,42};
 Scores = _context.AccountAttributeStatistics.Where(at => (at.AccountId == a.Id 
             && at.LatestVersion) && attributeIds.Contains(at.AttributeId))

答案 1 :(得分:3)

在您的查询中,支架丢失,因此始终包含LatestVersion。但我会使用允许AttributeIds的集合并使用Enumerable.Contains

int[] attributeIds = {39, 40, 41, 42, 43};

....
Scores = _context.AccountAttributeStatistics
    .Where(at => at.AccountId == a.Id 
              && at.LatestVersion 
              && attributeIds.Contains(at.AttributeId))
....

答案 2 :(得分:1)

您可以使用Contains()。这与sql中的IN相同。

.Where(at => at.AccountId == a.Id 
             && at.LatestVersion 
             && attributeIds.Contains(at.AttributeId))

答案 3 :(得分:1)

只需几个额外的括号即可解决您的问题:

Scores = _context.AccountAttributeStatistics.Where(at => at.AccountId == a.Id 
                     && at.LatestVersion && (at.AttributeId == 39 || at.AttributeId == 40 
                     || at.AttributeId == 41 || at.AttributeId == 42))