如果我有类似的话:
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查询包含重复的对象初始化代码时,我才会考虑重用。
由于
答案 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();