C# 从查询中选择单个对象

C# 从查询中选择单个对象,c#,linq,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

我有下面的查询,可以很好地提取我需要的数据

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中提取每个子FunctionName,其中FunctionNumber=Step和SubFunctionNumber=LogID。但是,当我将其绑定到datagrid时,用于显示名称的列只显示SQL查询字符串,实际上并不包含我想要的元素。我原以为我的.Selectx=>x.SubFunctionName可以做到这一点,但显然不行。对于使用LINQ和C来说还是很新的,那么我该怎么做呢?

问题行的LINQ仍然是一个表达式-Select返回一个IEnumerable而不是值-然后您要对它执行ToString。这就是为什么要恢复SQL

您需要解析表达式并从中获取实际对象。添加以获取FuncName应该可以做到这一点。如果FuncName已经是,则可能不需要转换为字符串:

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

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

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为空,你自己来处理这个问题。

好吧,这太简单了,哈哈。非常感谢Rhumborl的快速回答,它现在正在按它应该的方式工作!