在字典中首次出现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();
}
如果你知道总会有至少一个这样的好处,或者你不介意为缺失的值使用占位符,你可以使用这样的东西:
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()
或者,如果您想要所有优点的字符串表示,可以使用字符串。再次加入而不是第一次。