遍历 IEnumerable 并将它们传递给具有多个 if/else 条件的模型

Loop through an IEnumerable and pass them to a model with several if/else condition

我有一个 IEnumerable 这样的实体列表

return entities.Select(g => new Model(
                g.Field1,
                g.Field2,
                g.Field3
));

但是需求发生了变化,我需要遍历列表并检查每个实体中的特定字符串字段,然后将其传递给模型。 如果字符串字段等于某个字符串,比如“a”,那么它将以一种方式传递到模型中,但是当字符串字段等于“b”或“c”甚至“d”时,它将以一种方式传递到模型中根据字段的字符串类型相应地采用不同的方式。

return entities.
.GroupBy(x=> x.field =="a")
.Select(g => new Model(
                g.Field1,
                g.Field2,
                g.Field3,

else
.GroupBy(x=> x.field =="b")
.Select(g => new Model(
                g.Field4,
                g.Field5,
                g.Field6,

else
.GroupBy(x=> x.field =="c")
.Select(g => new Model(
                g.Field7,
                g.Field8,
                g.Field9,
);

我正在考虑做一个 foreach 然后一个 groupBy 然后 if 语句。但不确定如何为该 linq 语句构造适当的语法。 如果实体的数量可以达到数百个,在这种情况下是否也建议使用 foreach 循环?

您可以使用开关表达式 (new since C# 8)。为了将它与 EF 一起使用,您首先必须 select 一个包含所有需要的属性的匿名类型,并将其加载到内存中(例如 ToList()):

return entities.Select(g => new
{
    g.field, g.Field1, g.Field2, g.Field3,
    g.Field4, g.Field5, g.Field6, G.Field7,
    g.Field8, g.Field9
}).ToList().Select(g => g.field switch
{
   "a" => new Model(g.Field1, g.Field2, g.Field3),
   "b" => new Model(g.Field4, g.Field5, g.Field6),
   "c" => new Model(g.Field7, g.Field8, g.Field9)
});