2012-09-03 29 views
0

我使用EF 4拥有的通用查询方法库模式如下图所示:如何从IEnumerable转换为<type>类型?

public IEnumerable<T> Query(Expression<Func<T, bool>> filter) 
    { 
     return objectSet.Where(filter); 
    } 

我知道我可以选择这样一个完整的对象:

context.PeriodRepository.Query(a => a.EntityId == selectedEntityId); 

但我想通过一个Linq查询返回它作为type而不是IEnumerable<type>使用LINQ表达式而不更改方法。请告诉我如何做到这一点。

+1

你的意思是,你想要一个单一的结果?尝试将'.SingleOrDefault()'添加到命令的末尾。 –

+0

@AndreCalil查询已经返回单个结果,但事情是函数的返回类型是Enumarable ,我想要得到的结果只是该类型的对象,而不是IEnumarable 。 – haansi

+1

现在我明白你想要什么了。那么,这将是方法签名而不是论证,所以我相信你应该写第二种方法。此方法将使用当前的Query方法,但会调用SingleOrDefault并且返回类型为T,而不是集合 –

回答

1

查询描述在列表上执行的操作;您必须执行查询以获取结果。

使用.ToList()/.ToArray()将返回与查询匹配的所有项目。使用.First()可以获得匹配的第一个项目或获得第一个项目或获得第一个项目的默认值或.FirstOrDefault()

一个类的默认值是null

我觉得你的代码应该是这样的:

var myMatch = context.PeriodRepository 
    .Query(a => a.EntityId == selectedEntityId) 
    .First(); 

还要注意的是,当没有比赛First()会抛出异常。

+0

谢谢@Richard Schneider。它确实有帮助。请澄清一下。使用var我如何可以查询唯一的属性和不完整的对象。我想写一个查询得到第一个元素,并从第一个元素它只返回requried属性。 context.Signatories1Repository.Query((a => a.Id == obj.Id).First()。Select(x => x。名称)); – haansi

+0

“.First”之后有一个对象,因此您可以访问该属性。像'.Query(...)。First()。Name'会为您提供与查询匹配的第一个项目的名称。 –

3

使用First()FirstOrDefault()方法并传入谓词以查找所需的元素(如果它不是第一个)。

+0

它是唯一的项目,因此它是唯一的。事情是我的方法是返回IEnumarable 和我有类型的对象。我想将IEnumarable 转换为类型。请通知 – haansi

+1

IEnumerable 正在返回一个集合或元素列表。没有直接演员。您需要选择要使用的列表元素。如果要返回单个值,请将返回类型从IEnumerable 更改为仅键入。 – akton

+0

谢谢@akton。其实我早不了你。但它的工作。你可以pelase指导我如何修改我的查询返回只需reeuried proerty而不是完整的对象使用var?我想写一个查询soemthing liek: context.Signatories1Repository.Query((a => a.Id == obj.Id).First()。Select(x => x.Name)); 和我的查询mehtod的代码被提及的问题。 – haansi

相关问题