C# 同时获取集合的第一个和最后一个元素

C# 同时获取集合的第一个和最后一个元素,c#,entity-framework,mvvmcross,C#,Entity Framework,Mvvmcross,我目前正在从事一个跨平台项目 我在尝试在WebDataLayer.Models和Shared.Models之间映射模型时遇到了这个问题 namespace WebDataLayer.Models { public class Factory { public Guid Id { get; set; } public string Name { get; set; } public string Serie { get; set;

我目前正在从事一个跨平台项目

我在尝试在WebDataLayer.Models和Shared.Models之间映射模型时遇到了这个问题

namespace WebDataLayer.Models
{
    public class Factory
    {
        public Guid Id { get; set; }
        public string Name { get; set; }

        public string Serie { get; set; }

        public Guid? AreaId { get; set; }

        public virtual ICollection<FactoryHotline> FactoryHotlines { get; set; }
}

public class FactoryHotline
    {
        public Guid Id { get; set; }
        public Guid FactoryId { get; set; }

        [Required]
        [MaxLength(256)]
        public string Caption { get; set; }

        [Required]
        [MaxLength(256)]
        public string Hotline { get; set; }
    }
这是控制器中的代码,我尝试将
WebDatalayer.Models.Factory
转换为
Shared.Models.Factory

public ActionResult Edit()
        {
            var factories = _factoryService.All().OrderBy(p => p.Name);
            List<Shared.Models.Factory> response = new List<Shared.Models.Factory>();

            response =  factories.Select(k => new Shared.Models.Factory
             {
                 Id = k.Id,
                 Name = k.Name,
                 Serie = k.Serie,
                 Hotline1 = new Shared.Models.FactoryHotline {
                     Id = k.FactoryHotlines.FirstOrDefault().Id,
                     Caption = k.FactoryHotlines.FirstOrDefault().Caption,
                     Hotline = k.FactoryHotlines.FirstOrDefault().Hotline,
                     FactoryId = k.FactoryHotlines.FirstOrDefault().FactoryId
                 },
                 Hotline2 = new Shared.Models.FactoryHotline
                 {
                     Id = k.FactoryHotlines.LastOrDefault().Id,
                     Caption = k.FactoryHotlines.LastOrDefault().Caption,
                     Hotline = k.FactoryHotlines.LastOrDefault().Hotline,
                     FactoryId = k.FactoryHotlines.LastOrDefault().FactoryId
                 },
            }).OrderBy(f => f.Name).ToList();
            return View("Edit", response);
        }
public ActionResult Edit()
{
var factories=\u factoryService.All().OrderBy(p=>p.Name);
列表响应=新列表();
响应=工厂。选择(k=>newshared.Models.Factory
{
Id=k.Id,
Name=k.Name,
Serie=k.Serie,
Hotline1=新的Shared.Models.FactoryHotline{
Id=k.FactoryHotlines.FirstOrDefault().Id,
Caption=k.FactoryHotlines.FirstOrDefault().Caption,
热线=k.FactoryHotlines.FirstOrDefault()热线,
FactoryId=k.FactoryHotlines.FirstOrDefault().FactoryId
},
Hotline2=新的Shared.Models.FactoryHotline
{
Id=k.FactoryHotlines.LastOrDefault().Id,
Caption=k.FactoryHotlines.LastOrDefault().Caption,
热线=k.FactoryHotlines.LastOrDefault().热线,
FactoryId=k.FactoryHotlines.LastOrDefault().FactoryId
},
}).OrderBy(f=>f.Name).ToList();
返回视图(“编辑”,响应);
}
但是
linq-to-entities不识别lastordefault方法,不能使用
降序
,因为我同时也获取第一个元素


需要帮助

我不确定这是否是最干净的解决方案,但您可以将
链接到其中

.Where((v, i) => { return i == 0 || i == list.Count() -1; })
所以


您似乎希望返回按名称订购的所有工厂,对于每个工厂,返回第一条和最后一条热线:

var query = factories.Select(f => new Shared.Models.Factory
    {
        Id = f.Id, 
        Name = f.Name,
        Serie = f.Serie,
        Hotline1 = f.FactoryHotLines
            .OrderBy(h => h.Id)
            .Select(h => new Shared.Models.FactoryHotline 
            {
                Id = h.Id,
                Caption = h.Caption,
                Hotline = h.Hotline,
                FactoryId = h.FactoryId
            }).FirstOrDefault(),
        Hotline2 = x.FactoryHotLines
            .OrderByDescending(h => h.Id)
            .Select(h => new Shared.Models.FactoryHotline 
            {
                Id = h.Id,
                Caption = h.Caption,
                Hotline = h.Hotline,
                FactoryId = h.FactoryId
            }).FirstOrDefault(),
     }).OrderBy(f => f.Name)
     .ToList();
这里的关键点是:在使用
FirstOrDefault()
时,始终提供一个
OrderBy
子句。与其依赖于
FirstOrDefault()
来获取每个单独的值,不如将其与
OrderBy()
一起使用以获取实体,然后使用
Select()
将其缩减为所需的视图模型

上面的示例假设您需要添加它们的顺序。(标识基于身份的记录)通过这种方式,我们执行
OrderBy()
以获取第一条热线,然后执行
OrderByDescending()
以获取第二条热线

factories = factories.Where((v, i) => { return i == 0 || i == factories.Count() -1; })
var query = factories.Select(f => new Shared.Models.Factory
    {
        Id = f.Id, 
        Name = f.Name,
        Serie = f.Serie,
        Hotline1 = f.FactoryHotLines
            .OrderBy(h => h.Id)
            .Select(h => new Shared.Models.FactoryHotline 
            {
                Id = h.Id,
                Caption = h.Caption,
                Hotline = h.Hotline,
                FactoryId = h.FactoryId
            }).FirstOrDefault(),
        Hotline2 = x.FactoryHotLines
            .OrderByDescending(h => h.Id)
            .Select(h => new Shared.Models.FactoryHotline 
            {
                Id = h.Id,
                Caption = h.Caption,
                Hotline = h.Hotline,
                FactoryId = h.FactoryId
            }).FirstOrDefault(),
     }).OrderBy(f => f.Name)
     .ToList();