我有2个这样的课程:
public partial class Product
{
public ICollection<ProductTerm> ProductTerms { get; set; }
// More properties here
}
public partial class ProductTerm
{
public short ID { get; set; }
public short MinTermDuration { get; set; }
// More properties here
}
正如您将看到的,Product与ProductTerm有1对多的关系。
我正在尝试使用Min MinTermDuration返回整个ProductTerm。我可以在这里获得我想要的结果但是返回MinTermDuration - 如何返回整个ProductTerm?
int GetMinTerm()
{
return ProductTerms.Min(t => t.MinTermDuration);
}
答案 0 :(得分:5)
您可以先订购产品,然后再将第一个产品放在最上面。
return ProductTerms.OrderBy(t => t.MinTermDuration).FirstOrDefault();
答案 1 :(得分:1)
Min
返回最小值,而不是具有值的项目。您可以使用First
获取ProductTerm
的<{1}}:
MinTermDuration
另一种选择是使用MinBy
方法,它需要使用thir-party库,但更直接:
ProductTerm GetMinTerm()
{
var min = ProductTerms.Min(t => t.MinTermDuration);
return ProductTerms.First(x => x.MinTermDuration == min);
}
答案 2 :(得分:1)
你可以按照Vsevolod Goloviznin的建议使用OrderBy(...).FirstOrDefault()
;然而,这种方法需要对集合进行排序,其复杂度为O(n log n)
...... Selman22建议的方法更好,但它仍然枚举结果两次(如果序列是实体框架,这可能是一个问题或OData查询)。
更好的选择是使用MinBy
扩展方法,只需循环一次,然后返回具有最小值的项,复杂度为O(n)
:
return ProductTerms.MinBy(t => t.MinTermDuration);
您可以在Linq.Extras或MoreLinq中找到此类方法。
编辑:如果您正在使用内存中的集合(Linq to Objects),不,如果您正在使用数据库(使用实体框架),则上述情况属实例如)。 DB知道如何有效地找到具有最小值的项目;在这种情况下使用MinBy
将获取所有行以检查它们,因此效率非常低。