Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过_C#_Linq - Fatal编程技术网

C# 如何通过

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

我的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();
}

唯一的区别似乎在于新的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
的分组应该不会有什么区别@汤姆,你能解释一下吗?