Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按嵌套对象值Linq排序_C#_Linq - Fatal编程技术网

C# 如何按嵌套对象值Linq排序

C# 如何按嵌套对象值Linq排序,c#,linq,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 Addresse

对象

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; }
    }
}
名称空间示例
{
公共类ContractorAddValue
{
公共成员成员{get;set;}
公共列表地址{get;set;}
公共ICommand AddAddress{get;set;}
}
公共类地址
{
公共成员地址成员地址{get;set;}
公共ICommand编辑地址{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;
        }
public observeCollection getContractorOrderByCity()
{
var allContractors=(来自db.Member中的c,其中c.isContractor==true选择c.ToList();
//var allContractors2=db.Member.Include(c=>c.MemberAddress)。SelectMany(c=>c.MemberAddress)。OrderBy(c=>c.City)。Select(c=>c.Member)。ToList();
//var allcontactors=(从db.Member中的c开始,其中c.iscontactor==true选择c).OrderBy(c=>c.MemberAddress.OrderBy(x=>x.City)).ToList();x.MemberId==i.MemberId.OrderBy(x=>x.City.ToList();
ContractorAddValue ContractorAddValue=新的ContractorAddValue();
contractorAddValue.Member=i;
contractorAddValue.AddAddress=newBaseCommand(()=>ContractorsViewModel.SendAddress(i.MemberId));
contractorAddValue.Addresses=新列表();
foreach(地址列表中的变量a)
{
地址MemberAddress=新地址();
MemberAddress.MemberAddress=a;
MemberAddress.EditAddress=新建BaseCommand(()=>ContractorsViewModel.SendEditAddress(a.MemberAddressId,i.MemberId));
contractorAddValue.Addresses.Add(MemberAddress);
}
添加(contractorAddValue);
}
返回listContractorAddValue;
}
allContractors2-order by有效,但我检索重复成员。在这种方法中,我尝试在
Select(c=>c.Member)
之后使用
.Distinct()。
我的目标是通过
MemberAddress.City


提前谢谢

我认为这段代码可以工作,但您需要重新定义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;
            }
public observeCollection getContractorOrderByCity()
{
var allContractors=(来自db.Member中的c,其中c.isContractor==true选择c.ToList();
//var allContractors2=db.Member.Include(c=>c.MemberAddress)。SelectMany(c=>c.MemberAddress)。OrderBy(c=>c.City)。Select(c=>c.Member)。ToList();
//var allcontactors=(从db.Member中的c开始,其中c.iscontactor==true选择c).OrderBy(c=>c.MemberAddress.OrderBy(x=>x.City)).ToList();x.MemberId==i.MemberId.OrderBy(x=>x.City.ToList();
ContractorAddValue ContractorAddValue=新的ContractorAddValue();
contractorAddValue.Member=i;
contractorAddValue.AddAddress=newBaseCommand(()=>ContractorsViewModel.SendAddress(i.MemberId));
contractorAddValue.Addresses=新列表();
foreach(地址列表中的变量a)
{
地址MemberAddress=新地址();
MemberAddress.MemberAddress=a;
MemberAddress.EditAddress=新建BaseCommand(()=>ContractorsViewModel.SendEditAddress(a.MemberAddressId,i.MemberId));
contractorAddValue.Addresses.Add(MemberAddress);
}
如果(!listContractorAddValue.Contains(contractorAddValue)){
添加(contractorAddValue);
}否则{
var contAddValue=listContractorAddValue.First(l=>l.Equals(contractorAddValue));
contAddValue.Addresses.AddRange(contractorAddValue.Addresses);
}
}
返回listContractorAddValue;
}

似乎一个成员可以有多个地址,那么这不是出现重复成员的原因吗?如果成员有多个地址,该怎么办?“一个成员似乎有多个地址”—是的,成员可以有多个地址“如果成员有多个地址,该怎么办?”地址列表嵌套在成员列表中,成员不应重复。我通过试错法找到了答案-distinct()dosent work anyware at query,但在loop works==>foreach(allcontactors.distinct()中的var I)