在字典中首次出现LINQ

本文关键字:LINQ 字典 | 更新日期: 2023-09-27 18:27:55

我有下面的代码,即使在代码中第一次出现后,它也会保持循环。我想停止,但我不能在中应用Any

    public List<FieldConfiguration> GetListOfProvisionsForBenefits(Dictionary<int, string> benefits)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("SELECT ProvisionID ,BenefitID,ProvisionName, BPROV_Flags FROM BenefitProvisions WHERE");
        int intSQLvar = 0;
        string strSeperator = string.Empty;
        foreach (KeyValuePair<int, string> benefit in benefits)
        {
            sb.AppendFormat(" {0} BenefitID=@benerfit{1}", strSeperator, intSQLvar);
            intSQLvar++;
            strSeperator = "OR";
        }
        SqlConnection con = new SqlConnection(m_strDBConnectionString);
        SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.CommandText = sb.ToString();
        intSQLvar = 0;
        foreach (KeyValuePair<int, string> benefit in benefits)
        {
            cmd.Parameters.Add(string.Format("@benerfit{0}", intSQLvar), SqlDbType.Int, 32).Value = benefit.Key.ToString();
            intSQLvar++;
        }
        DataSet ds = new DataSet();
        try
        {
            con.Open();
            sqlDataAdapter.SelectCommand = cmd;
            sqlDataAdapter.Fill(ds);
        }
        finally
        {
            if (con != null)
            {
                con.Close();
                con = null;
            }
        }
        List<ProvisionDetails> lstProvisions = new List<ProvisionDetails>();
        if (ds != null && ds.Tables[0].Rows.Count > 0)
        {
                lstProvisions = (from r in ds.Tables[0].AsEnumerable()
                                select new ProvisionDetails()
                        {
                            ID = r.Field<int>("ProvisionID"),
                            Name = r.Field<string>("ProvisionName"),
                            BenefitID = r.Field<int>("ProvisionID"),
                            OptionValue =  r.Field<int>("ProvisionID") 
                        }).ToList();
            if (benefits.Count == 1)
            {
                return (from p in lstProvisions
                        select new FieldConfiguration()
                        {
                            Name = p.Name,
                            ProvisionFieldID = p.ID.ToString(),
                            FieldType = Configuration.SyncapayPlus.FieldType.Provision,
                            Caption = (from b in benefits 
                                           where(b.Key == p.BenefitID)
                                       select string.Format("{0}_{1}", b.Value, p.Name)).ToString() // to do change caption  benefitname_provisionName
                        }).ToList();
            }
            else
            {
                return (from p in lstProvisions.GroupBy(x => x.Name)
                .Where(y => y.Count() > 1)
               .SelectMany(z => z)
                        select new FieldConfiguration()
                        {
                            Name = p.Name,
                            ProvisionFieldID = p.ID.ToString(),
                            FieldType = Configuration.SyncapayPlus.FieldType.Provision,
                            SourceOption = p.OptionValue.ToString(),
                            Caption =
                            (from b in benefits
                             where (b.Key == p.BenefitID)
                             select string.Format("{0}_{1}", b.Value, p.Name)).ToString() // to do change caption  benefitname_provisionName
                        }).ToList();
            }

        }
        return null;
    }

我想在我得到标题的这一部分应用ANY;当我发现第一个好处时,我希望它退出并分配它:

Caption =
     (from b in benefits
     where (b.Key == p.BenefitID)
     select string.Format("{0}_{1}", b.Value, p.Name)).ToString() // to do change caption  benefitname_provisionName
                           }).ToList();
            } 

在字典中首次出现LINQ

如果你知道总会有至少一个这样的好处,或者你不介意为缺失的值使用占位符,你可以使用这样的东西:

Caption = string.Format("{0}_{1}",
                        benefits.Where(b => b.Key == p.BenefitID)
                                .Select(b => b.Value)
                                .FirstOrDefault(), // Or First
                        p.Name);

不过,我建议您不要过多地混合和匹配查询表达式和点表示法——目前这很令人困惑。

您可以在此处使用FirstorDefault。(在我的评论后将其作为答案发布)

Caption = string.Format("{0}_{1}",
                        benefits.Where(b => b.Key == p.BenefitID)
                                .Select(b => b.Value)
                                .FirstOrDefault(), // Or First
                        p.Name);

它将返回序列的第一个元素,如果序列不包含元素,则返回默认值

我同意您在这里做得太多的评论,这会使可读性非常困难,因此会使调试和未来的可维护性非常困难。

然而,为了回答你的问题,你可能想尝试以下方法:

(from b in benefits
 where (b.Key == p.BenefitID)
 select string.Format("{0}_{1}", b.Value, p.Name)).First()

 (from b in benefits
  where (b.Key == p.BenefitID)
  select string.Format("{0}_{1}", b.Value, p.Name)).FirstOrDefault()

我认为.ToString()是多余的。

首先,修复缩进,在不需要时不要在查询语法和传统语法之间切换。这样可以更容易地发现和理解问题。

return (from p in lstProvisions
        group x by x.Name into y
        where y.Count() > 1
        from z in y
        select new FieldConfiguration()
          {
            Name = p.Name,
            ProvisionFieldID = p.ID.ToString(),
            FieldType = Configuration.SyncapayPlus.FieldType.Provision,
            SourceOption = p.OptionValue.ToString(),
            Caption = (from b in benefits
                       where b.Key == p.BenefitID
                       select string.Format("{0}_{1}", b.Value, p.Name)
                      ).ToString()
          }
       ).ToList()

在询问有关代码的问题时,您可能还需要考虑不使用x、y、z等变量名。

所以,现在,我可以看到你的问题在哪里了:你在查询中使用ToString,但你可能想要第一个标题:

return (from p in lstProvisions
        group x by x.Name into y
        where y.Count() > 1
        from z in y
        select new FieldConfiguration()
          {
            Name = p.Name,
            ProvisionFieldID = p.ID.ToString(),
            FieldType = Configuration.SyncapayPlus.FieldType.Provision,
            SourceOption = p.OptionValue.ToString(),
            Caption = (from b in benefits
                       where b.Key == p.BenefitID
                       select string.Format("{0}_{1}", b.Value, p.Name)
                      ).First() // perhaps FirstOrDefault() or FirstOrDefault() ?? ""
          }
       ).ToList()

或者,如果您想要所有优点的字符串表示,可以使用字符串。再次加入而不是第一次。