我的aspnet核心应用程序中有一个linq查询,它返回的行数应该更多。查询如下。
public List<csAutoComplete> GetAutoComplete(string Type, string filter)
{
string[] GasCodesnotListed = { "F97", "F98", "F99" };
Model1 = from x in _context.TblGascodes
where ((x.GasCode.StartsWith("F13") || x.GasName.StartsWith("F13")) &&
!GasCodesnotListed.Contains(x.FedclusterCode))
orderby x.GasCode
group x by new csAutoComplete { ACCode = x.GasCode, ACName = x.GasName } into Alpha
select new csAutoComplete <=== (Is this the issue???)
{
ACCode = Alpha.Key.ACCode,
ACName = Alpha.Key.ACCode + " - " + Alpha.Key.ACName
};
return Model1.ToList();
}
} 返回(7)结果
所以我粘贴到LINQ pad并获得了我期望的结果(1)
string[] GasCodesnotListed = { "F97", "F98", "F99" };
TblGasCodes
.Where (
x =>
((x.GasCode.StartsWith ("F13") || x.GasName.StartsWith ("F13")) &&
!(GasCodesnotListed.Contains (x.GasCode))
)
)
.OrderBy (x => x.GasCode)
.GroupBy (
x =>
new
{
ACCode = x.GasCode,
ACName = x.GasName
}
)
.Select (
Alpha =>
new
{
ACCode = Alpha.Key.ACCode,
ACName = ((Alpha.Key.ACCode + " - ") + Alpha.Key.ACName)
}
)
唯一的区别似乎是在新的csAutoComplete中。如果这是一个类定义,为什么它会产生影响呢?我该如何解决这个问题。
答案 0 :(得分:0)
在你的代码中,GasCodesnotListed.Contains似乎有一个重要的区别(一个看着FedclusterCode,另一个看看GasCode):
where (x.GasCode.StartsWith ("F13") && !GasCodesnotListed.Contains (x.**FedclusterCode**))
...与...
.Where (
x =>
(
x.GasCode.StartsWith ("F13") &&
!(GasCodesnotListed.Contains (x.**GasCode**))
)
)
答案 1 :(得分:0)
除非您在Equals
中覆盖csAutoComplete
,否则GroupBy
会使用csAutoComplete
或某些等效内容来比较Object.ReferenceEquals()
的实例。具有相同GasCode
和GasName
属性的两个实例将是两个单独的组键。如果您有七件物品进入,则会将它们分为七组,每组一件。
匿名类型不是这种情况。具有相同属性值的单独实例将被GroupBy
视为相等。
var items = new[] { 0, 0 }.Select(n => new { x = n, y = n.ToString() }).ToArray();
var groups = items.GroupBy(x => x).ToArray();
// Not equal here!
var aretheyequal = items[0] == items[1];
// But GroupBy isn't fooled: There's only one group
var groupcount = groups.Length;
如果您希望生活在边缘,请将您的匿名类型用于组密钥 - 或Equals
上的csAutoComplete
重载。根据我的经验,它可能会导致有趣的错误(或者更准确地说,程序员通过不注意它引入的更改来编写有趣的错误)。我不想去那里。
因此,我认为你的GetAutoComplete
方法是正常的,除了逐行,我会改为:
group x by new { ACCode = x.GasCode, ACName = x.GasName } into Alpha
后来对ACCode = Alpha.Key.ACCode
等的引用不需要改变,因为属性名称是相同的。