如何通过

时间:2017-04-21 19:56:38

标签: 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("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中。如果这是一个类定义,为什么它会产生影响呢?我该如何解决这个问题。

2 个答案:

答案 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()的实例。具有相同GasCodeGasName属性的两个实例将是两个单独的组键。如果您有七件物品进入,则会将它们分为七组,每组一件。

匿名类型不是这种情况。具有相同属性值的单独实例将被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等的引用不需要改变,因为属性名称是相同的。