linq和对象初始化

时间:2009-02-07 20:53:13

标签: linq

如果我有类似的话:

var query = from children in _data.Children
    where children.ChildId == childId
    select new CustomModel.MyChild
    {
        ChildId = children.ChildId,
        Name = children.ChildName
    };

return query.FirstOrDefault();

我希望结果对象成为我的自定义模型。

我可以用不同的方法处理自定义模型实例化吗?如果我有多个linq查询都生成了自定义子模型,那么可以重用它吗?

例如,

var query = from children in _data.Children
    where children.ChildId == childId
    select CreateMyCustomChild([param ??]);

return query.FirstOrDefault();

这可能是不可能的,我不知道,但如果有可能,方法签名是什么样的?

当只有多个linq查询包含重复的对象初始化代码时,我才会考虑重用。

由于

4 个答案:

答案 0 :(得分:1)

这实际上取决于您使用的LINQ版本。如果您正在使用LINQ to SQL,我不相信您可以在查询中调用任意方法。查询翻译器不知道如何处理方法调用

如果你正在使用LINQ to Objects,你可以这么做,就像这样:

var query = from children in _data.Children
    where children.ChildId == childId
    select CreateMyCustomChild(children)

return query.FirstOrDefault();

// Elsewhere

public CustomModel.MyChild CreateMyCustomChild(OtherChild child)
{
    return new CustomModel.MyChild
    {
        ChildId = child.ChildId,
        Name = child.ChildName
    };
}

(旁注:我会在查询“child”中调用范围变量而不是“children”,因为在任何时候它只代表一个孩子。)

答案 1 :(得分:0)

如果你想要,你可以写“select 1”或在你的情况下写“CreateMyCustomChild(children)”因为“children”包含你所有的信息。在你的情况下,你没有向“孩子”添加很多信息,为什么不“选择孩子”?

换句话说,试一试吧。值的返回类型将决定LINQ枚举的类型。

答案 2 :(得分:0)

假设您有一个为您进行转换的方法。

public static class Conversions
{
  public static CustomModel.MyChild ToCustomModel(this DataModel.MyChild source)
  {
    return new CustomModel.MyChild()
    {
      ChildId = source.ChildId,
      Name = source.ChildName
    }
  }
}

您可以使用这种方法进行单个项目的转换。

DataModel.MyChild myResult = getResult();
CustomModel.MyChild myConvertedResult = myResult.ToCustomModel()

这种方法也可用于Enumerable.Select方法调用。

IEnumerable<DataModel.MyChild> myQueriedResults = getResult();
IEnumerable<CustomModel.MyChild> myConvertedResults =
  myQueryiedResults.Select(c => c.ToCustomModel());

答案 3 :(得分:0)

虽然你可以使用表达式,但我认为这不值得麻烦。相反,我建议你定义一个扩展方法,如:

IQueryable<CustomModel.MyChild> ToModel(this IQueryable<Child> childs)
{
    return childs.Select( c=>
       select new CustomModel.MyChild
       {
           ChildId = children.ChildId,
           Name = children.ChildName
       }    
    );
}

然后你可以打电话:

return _data.Children
     .Where(c=>c.ChildId == childId)
     .ToModel()
     .FirstOrDefault();