2009-02-07 190 views
0

如果我有这样的: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查询包含重复的对象初始化代码时重用。

感谢

回答

1

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

如果您使用LINQ到对象,你是绝对没这样做,这样做:

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”时调用范围变量,因为在任何时候它只代表一个孩子。)

+0

@乔恩 - 谢谢。可悲的是,它是linqtosql。还有关于奇异孩子的观点。 – 2009-02-08 13:09:35

0

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

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

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()); 
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();