C# 如果找到匹配项,请选择特定记录,否则请选择i分组中的第一条记录<;T>;

C# 如果找到匹配项,请选择特定记录,否则请选择i分组中的第一条记录<;T>;,c#,linq,C#,Linq,以下是我的LINQ查询: pmcPrices = (from pd in interfaceCtx.PmcPriceDatas where pd.ClientIdValue != null && pd.ClientIdCode == "FII" && (pd.MetricVal != null || pd.PMCPrice1 != null || pd.PMCPrice

以下是我的LINQ查询:

pmcPrices = (from pd in interfaceCtx.PmcPriceDatas
            where
            pd.ClientIdValue != null
            && pd.ClientIdCode == "FII"
            && (pd.MetricVal != null || pd.PMCPrice1 != null || pd.PMCPrice2 != null)
            && pd.EffectiveDate.Value == eodDate.DateTime
            group pd by pd.ClientIdValue into g
            select g).ToDictionary(g => Convert.ToInt32(g.Key),
                                   g => g.SingleOrDefault(p => p.FeedCode == "EQRMS-CB"));
我想要实现的是,如果组“g”中的任何记录具有FeedCode==“EQRMS-CB”选择该记录,否则选择组“g”中的第一个记录。

您可以使用

你可以用一个


如果没有匹配项(只要您得到一个匹配项),或者如果您使用的Linq提供程序具有稳定的
OrderBy
(Linq到使用它的对象和提供程序是,大多数不是),那么:

否则:

g => g.FirstOrDefault(p => p.FeedCode == "EQRMS-CB") ?? g.FirstOrDefault()

如果没有匹配项(只要您得到一个匹配项),或者如果您使用的Linq提供程序具有稳定的
OrderBy
(Linq到使用它的对象和提供程序是,大多数不是),那么:

否则:

g => g.FirstOrDefault(p => p.FeedCode == "EQRMS-CB") ?? g.FirstOrDefault()

我可能会将此作为两个查询来执行。如果第一个没有使用FeedCode(not.Any())返回值,那么运行第二个,而不使用where子句,该子句只执行order by并返回第一条记录。否则LINQ可能会变得非常复杂……只要确保对
的调用是确定的,就可以对组中的元素进行排序。没有什么比运行相同的代码并得到不同的结果更糟糕的了。我可能会把这当作两个查询来做。如果第一个没有使用FeedCode(not.Any())返回值,那么运行第二个,而不使用where子句,该子句只执行order by并返回第一条记录。否则LINQ可能会变得非常复杂……只要确保对
的调用是确定的,就可以对组中的元素进行排序。没有什么比运行相同的代码并得到不同的结果更糟糕的了。或者
g=>g.FirstOrDefault(p=>p.FeedCode==“EQRMS-CB”)??g、 First()
g=>g.FirstOrDefault(p=>p.FeedCode==“EQRMS-CB”)??g、 First()
g => g.FirstOrDefault(p => p.FeedCode == "EQRMS-CB") ?? g.FirstOrDefault()