我有以下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来实现这一目标?
答案 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))