如何通过嵌套对象值Linq订购

时间:2018-06-19 17:58:39

标签: c# linq

对象

namespace Example
{
    public class ContractorAddValue
    {
        public Member Member { get; set; }
        public List<Addresses> Addresses { get; set; }
        public ICommand AddAddress { get; set; }
    }

    public class Addresses
    {
        public MemberAddress MemberAddress { get; set; }
        public ICommand EditAddress { get; set; }
    }
}

查询

public ObservableCollection<ContractorAddValue> GetContractorsOrderByCity()
        {
            var allContractors = (from c in db.Member where c.IsContrator == true select c).ToList();
            //var allContractors2 = db.Member .Include(c => c.MemberAddress).SelectMany(c => c.MemberAddress).OrderBy(c => c.City).Select(c => c.Member ).ToList(); 
            //var allContractors = (from c in db.Member  where c.IsContrator == true select c).OrderBy(c => c.MemberAddress.OrderBy(x => x.City)).ToList(); <= dosent work

            var listContractorAddValue = new ObservableCollection<ContractorAddValue>();

            foreach (var i in allContractors)
            {
                var adressList = db.MemberAddress.Where(x => x.MemberId == i.MemberId).OrderBy(x => x.City).ToList();

                ContractorAddValue contractorAddValue = new ContractorAddValue();
                contractorAddValue.Member = i;
                contractorAddValue.AddAddress = new BaseCommand(() => ContractorsViewModel.SendAddress(i.MemberId ));
                contractorAddValue.Addresses = new List<Addresses>();

                foreach (var a in adressList)
                {
                    Addresses memberAdress = new Addresses();
                    memberAdress.MemberAddress = a;
                    memberAdress.EditAddress = new BaseCommand(() => ContractorsViewModel.SendEditAddress(a.MemberAddressId , i.MemberId ));
                    contractorAddValue.Addresses.Add(memberAdress);
                }

                listContractorAddValue.Add(contractorAddValue);
            }
            return listContractorAddValue;
        }

allContractors2-按工作顺序排列,但我检索重复的Member。在这种方法中,我尝试在.Distinct()之后使用Select(c => c.Member),但是它确实起作用(整个查询停止工作)。 我的目标是在MemberAddress.City

下订单

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我认为这段代码可以工作,但是您需要重新定义ContractorAddValue类的Equals方法。

当您想将contractorAddValue添加到列表时,我添加了一个if语句。首先,您需要检查列表中是否包含该对象。如果没有,则将对象添加到列表中。如果是,则需要找到该对象并将其地址列表与要添加的对象的地址列表合并。

public ObservableCollection<ContractorAddValue> GetContractorsOrderByCity()
            {
                var allContractors = (from c in db.Member where c.IsContrator == true select c).ToList();
                //var allContractors2 = db.Member .Include(c => c.MemberAddress).SelectMany(c => c.MemberAddress).OrderBy(c => c.City).Select(c => c.Member ).ToList(); 
                //var allContractors = (from c in db.Member  where c.IsContrator == true select c).OrderBy(c => c.MemberAddress.OrderBy(x => x.City)).ToList(); <= dosent work

                var listContractorAddValue = new ObservableCollection<ContractorAddValue>();

                foreach (var i in allContractors)
                {
                    var adressList = db.MemberAddress.Where(x => x.MemberId == i.MemberId).OrderBy(x => x.City).ToList();

                    ContractorAddValue contractorAddValue = new ContractorAddValue();
                    contractorAddValue.Member = i;
                    contractorAddValue.AddAddress = new BaseCommand(() => ContractorsViewModel.SendAddress(i.MemberId ));
                    contractorAddValue.Addresses = new List<Addresses>();

                    foreach (var a in adressList)
                    {
                        Addresses memberAdress = new Addresses();
                        memberAdress.MemberAddress = a;
                        memberAdress.EditAddress = new BaseCommand(() => ContractorsViewModel.SendEditAddress(a.MemberAddressId , i.MemberId ));
                        contractorAddValue.Addresses.Add(memberAdress);
                    }
                    if(!listContractorAddValue.Contains(contractorAddValue)){
                        listContractorAddValue.Add(contractorAddValue);
                    } else {
                       var contAddValue = listContractorAddValue.First(l => l.Equals( contractorAddValue));
                      contAddValue.Addresses.AddRange(contractorAddValue.Addresses);           
                    }
                }
                return listContractorAddValue;
            }