C# 如何通过
我的aspnet核心应用程序中有一个linq查询,它返回的行比它应该返回的多。查询如下C# 如何通过,c#,linq,C#,Linq,我的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
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();
}
唯一的区别似乎在于新的csAutoComplete。如果这是一个类定义,为什么会有区别呢?如何解决此问题。在您的代码中,GasCodesnotListed.Contains(一个查看FedclusterCode,另一个查看GasCode)中似乎有一个重要的区别: …对
.Where (
x =>
(
x.GasCode.StartsWith ("F13") &&
!(GasCodesnotListed.Contains (x.**GasCode**))
)
)
在您的代码中,GasCodesnotListed.Contains(一个查看FedclusterCode,另一个查看GasCode)似乎有一个重要的区别: …对
.Where (
x =>
(
x.GasCode.StartsWith ("F13") &&
!(GasCodesnotListed.Contains (x.**GasCode**))
)
)
除非您在
csAutoComplete
中重写Equals
,GroupBy
将使用Object.ReferenceEquals()
或某些等效项比较csAutoComplete
的实例。两个具有相同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;
使用您的匿名类型作为组密钥——或者在csAutoComplete
上重载Equals
,如果您想生活在边缘。根据我的经验,它可能会导致有趣的bug(或者更准确地说,程序员编写有趣的bug时没有注意到它带来的变化)。我宁愿不去那里
因此,我认为您的GetAutoComplete
方法是可以的,除了groupby line之外,我将其更改为:
group x by new { ACCode = x.GasCode, ACName = x.GasName } into Alpha
后面对
ACCode=Alpha.Key.ACCode
等的引用不需要更改,因为属性名称相同 除非您在csAutoComplete
中重写Equals
,GroupBy
将使用Object.ReferenceEquals()
或某些等效项比较csAutoComplete
的实例。两个具有相同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;
使用您的匿名类型作为组密钥——或者在csAutoComplete
上重载Equals
,如果您想生活在边缘。根据我的经验,它可能会导致有趣的bug(或者更准确地说,程序员编写有趣的bug时没有注意到它带来的变化)。我宁愿不去那里
因此,我认为您的GetAutoComplete
方法是可以的,除了groupby line之外,我将其更改为:
group x by new { ACCode = x.GasCode, ACName = x.GasName } into Alpha
后面对
ACCode=Alpha.Key.ACCode
等的引用不需要更改,因为属性名称相同 如果csAutoComplete
没有覆盖Equals
,它将通过对象进行比较。ReferenceEquals()
,而对于GroupBy,如果所有属性都相同,则匿名类型(如第二个示例中)是相同的。我会使用匿名类型进行分组。当你说匿名类型时,我不明白。您的意思是创建新变量并删除类吗?在第二个版本中,您有new{ACCode=x.GasCode,ACName=x.GasName}
--您正在那里创建一个匿名类型的实例。这是因为将有多个csAutoComplete
的引用,并且即使在值相同的情况下也没有相同的引用,除非您重写了Equals
和GetHashcode
方法。。匿名类型没有这个问题。@TomS请参阅更新我的答案。如果csAutoComplete
没有覆盖Equals
,它将通过对象进行比较。ReferenceEquals()
,而对于GroupBy,如果所有属性都相同,匿名类型(如第二个示例中的)是相同的。我会使用匿名类型进行分组。当你说匿名类型时,我不明白。您的意思是创建新变量并删除类吗?在第二个版本中,您有new{ACCode=x.GasCode,ACName=x.GasName}
--您正在那里创建一个匿名类型的实例。这是因为将有多个csAutoComplete
的引用,并且即使在值相同的情况下也没有相同的引用,除非您重写了Equals
和GetHashcode
方法。。匿名类型没有这个问题。@TomS请参阅更新我的答案。如果是LINQ to对象,则这是正确的。然而,我认为\u context.TblGascodes
不是一个IEnumerable
,而是一个从实体框架或LINQ到SQL的IQueryable
。因此,表达式Model1
作为一个整体将被转换为SQL,有或没有csAutoComplete
的分组应该不会有什么区别@汤姆,你能解释一下吗?这对物体来说是正确的。然而,我认为\u context.TblGascodes
不是一个IEnumerable
,而是一个从实体框架或LINQ到SQL的IQueryable
。因此,表达式Model1
作为一个整体将被转换为SQL,有或没有csAutoComplete
的分组应该不会有什么区别@汤姆,你能解释一下吗?