从查询中选择单个对象

时间:2014-09-24 10:04:22

标签: c# linq

我有以下查询,可以完美地提取我需要的数据。

var subFuncName = from a in m_dcSQL_ConnectionProdTest.DC3_SubFunctions
                      where a.VersionIndex == versionIndex && stepDistinct.Select(b => b.Step).Contains(a.FunctionNumber) && stepDistinct.Select(c => c.LogID).Contains(a.SubFunctionNumber)
                      select new
                         {
                             a.FunctionNumber,
                             a.SubFunctionNumber,
                             a.SubFunctionName,
                         };

然后我想将一些数据添加到列表中。

foreach (var item in stepDistinct)
{
      lstPareto.Add(new clsPareto(Convert.ToInt32(item.Step), Convert.ToInt32(item.LogID),
      stepLogID.Where(p => p.Step.Equals(item.Step) && p.LogID.Equals(item.LogID)).Count(),
      subFuncName.Where(x => x.FunctionNumber.Equals(item.Step) && x.SubFunctionNumber.Equals(item.LogID)).Select(x => x.SubFunctionName).ToString())); --THIS LINE IS THE PROBLEM--
}

我的clsPareto课程:

public class clsPareto
    {       
        public int intStep { get; set; }
        public int intLogID { get; set; }
        public int iCount { get; set; }
        public string strFuncName { get; set; }

        public clsPareto(int ParetoStep, int ParetoLogID, int Count, string FuncName)
        {
            intStep = ParetoStep;
            intLogID = ParetoLogID;
            iCount = Count;
            strFuncName = FuncName;
        }        
    }

我想要做的是从subFuncName中提取每个SubFunctionName,其中FunctionNumber = Step和SubFunctionNumber = LogID。但是,当我将它绑定到我的数据网格时,用于显示名称的列只显示SQL查询字符串而不实际采用我想要的元素。我以为我的.Select(x => x.SubFunctionName)可以做到这一点,但显然它没有。使用LINQ和C#还是一个新手,那么我该如何做呢?

2 个答案:

答案 0 :(得分:1)

问题行的linq仍然是一个表达式 - Select()返回IEnumerable而不是值 - 然后你正在对其进行ToString()。这就是你回来的原因。

您需要解析表达式并从中获取实际对象。添加Single()以获取FuncName应该这样做。如果FuncName已经是:

,您可能也不需要转换为字符串
subFuncName.Where(x => x.FunctionNumber.Equals(item.Step) && x.SubFunctionNumber.Equals(item.LogID))
    .Select(x => x.SubFunctionName).Single().ToString()));

答案 1 :(得分:0)

如果集合中没有匹配的元素,此解决方案将抛出异常。

subFuncName.Where(x => x.FunctionNumber.Equals(item.Step) && x.SubFunctionNumber.Equals(item.LogID))
    .Select(x => x.SubFunctionName).Single().ToString()));

可以使用;

 var subFuncName = subFuncName.Where(x => x.FunctionNumber.Equals(item.Step) && x.SubFunctionNumber.Equals(item.LogID))
        .Select(x => x.SubFunctionName).FirstOrDefault());

  if(subFuncName != null)
     // Add it
   else
     subFuncName == "UNDEFINED";

并且如果subFuncName自己为null,则处理该案例。