2

我有这个实体:

public class Parent: AllDependant
{
    /*Properties goes here*/
}

public class Children: AllDependant
{
    /*Properties goes here*/
}

然后我有allDependantstypeof 的变量List<AllDependant>,它将保持一些父母和孩子的实体混合。

稍后,我想从中选择并执行以下操作:

var selectedDependantInfos = allDependants
        .Select(dependant =>
        {
            if (dependant is Parent)
            {
                var parent = dependant as Parent;
                return new { Name = parent.Name, SomeSpecialInfo = parent.ParentInfo };
            }
            else
            {
                var child = dependant as Children;
                return new { Name = child.Name, SomeSpecialInfo = child.ChildInfo }
            }
        });

请注意子级和父级的特定属性要求我将属性转换为用于 UI 显示的新模型,这与实体无关。我不能将特殊属性放在 AllDependant 基类中,因为我需要在包括 *.ascx 在内的许多文件上重构属性名称,这很麻烦。但是它是通过使用Select上面的 Linq 扩展方法完成的,但我只是想到了这一点:

问题:我怎样才能在 Linq Query 中做同样的事情?

这将在select关键字和花括号上给出错误:

var selectedDependantInfos = from dependant in allDependants
                            select
                            {
                                /* the same if statement goes here */
                            }
4

3 回答 3

3

您将使用条件运算符并得到类似

  from dependant in allDependants             
  select dependant is Parent 
         ? new { Name = (dependant as Parent).Name,  /* Parent fields */ }
         : new { Name = (dependant as Children).Name, /* Child fields */ }

但正如你所见,这并不是一个很大的改进。没有方便的地方进行类型转换。

更好的选择似乎是将 Name 和 SpecialInfo 属性移至基类(AllDependant 或特殊的中间类)。

于 2012-04-04T06:25:30.140 回答
2

另一种选择是:

var parents = allDependants.OfType<Parent>.Select(p => new { Name =  p.Name, .... };
var children = allDependants.OfType<Children>.Select(c => new { Name =  c.Name, .... };

var combined = parents.Concat(children);

这种方法的缺点是 addDependants 将被迭代两次。

于 2012-04-04T06:56:07.547 回答
0

使用反射的另一种方式

var selectedDependantInfos = from p in allDependants
                         let key = p is Parent ? "ParentInfo" : "ChildInfo"
                         select new { 
                             Name = p.GetType().GetProperty("Name").GetValue(p, null).ToString(), 
                             SomeSpecialInfo = p.GetType().GetProperty(key).GetValue(p, null).ToString() 
                         };
于 2012-04-04T07:19:47.993 回答