C# 重用linq语句中的select新对象

C# 重用linq语句中的select新对象,c#,linq,asp.net-core,C#,Linq,Asp.net Core,下面是我的linq代码,它可以工作。我的问题是如何“重用”函数中的新ContactResponse和新AddressResponse部分,以便在另一个查询中重用它 var queryset = ( from a in _repoWrapper.Workshop.FindAll() where (a.IsActive == true && a.Entity.EntityType.Code == Global.EntityTypeSer

下面是我的linq代码,它可以工作。我的问题是如何“重用”函数中的新ContactResponse和新AddressResponse部分,以便在另一个查询中重用它

var queryset = (
            from a in _repoWrapper.Workshop.FindAll()
            where (a.IsActive == true && a.Entity.EntityType.Code == Global.EntityTypeServiceCenterCode)
            select new ServiceCenterResponse
            {
                Id = a.Id,
                Name = a.Name,
                EntityId = a.EntityId,
                Contacts = a.WorkshopContacts.Select(p => new ContactResponse
                {
                    Id = p.Contact.Id,
                    Type = p.Contact.ContactType.Description,
                    Code = p.Contact.ContactType.Code,
                    Value = p.Contact.Value
                }).ToList(),
                Addresses = a.WorkshopAddresses.Select(p => new AddressResponse
                {
                    Id = p.Address.Id,
                    AddressType = p.Address.AddressType.Code,
                    StreetLine1 = p.Address.StreetLine1,
                    StreetLine2 = p.Address.StreetLine2,
                    City = p.Address.City,
                    State = p.Address.State,
                    PostCode = p.Address.PostCode,
                    Country = p.Address.Country,
                    Longitude = p.Address.Longitude,
                    Latitude = p.Address.Latitude,
                    Others = p.Address.Others
                }).ToList()
            }
        );

Linq在Select方法中有一个Func类型的参数。这意味着您可以向它传递一个方法。 让我试着做一个例子

List<int> list = new List<int> { 1, 2, 3 };
list.Select(AddOne);

如果我正确理解您的问题,请尝试以下方法:

 Func<WorkshopContact, ContactResponse> contactResponseProjection= p => new ContactResponse
 {
   Id = p.Contact.Id,
   Type = p.Contact.ContactType.Description,
   Code = p.Contact.ContactType.Code,
   Value = p.Contact.Value
 };

你能给我们一个例子说明你将如何使用这些可重新密封的查询吗?创建一个方法,比如CreateContactResponse,它接受WorkshopContact参数并返回一个ContactResponse对象,然后使用类似于
a.WorkshopContacts.Select(p=>CreateContactResponse(p)).ToList()
 Func<WorkshopContact, ContactResponse> contactResponseProjection= p => new ContactResponse
 {
   Id = p.Contact.Id,
   Type = p.Contact.ContactType.Description,
   Code = p.Contact.ContactType.Code,
   Value = p.Contact.Value
 };
...
  Contacts = a.WorkshopContacts.Select(contactResponseProjection).ToList(),
...