使用Linq将数据从一个集合传递到另一个集合

时间:2011-07-21 16:22:41

标签: c# linq

我想使用LINQ将数据从一个自定义集合传递到另一个自定义集合。它很复杂,因为该集合有2个子集合。

想要将数据复制到:

public class Quote
{
    public int Id { get; set; }
    public string Type { get; set; }
    public virtual ICollection<Rate> Rates { get; set; }
}

public class Rate
{
    public int Id { get; set; }
    public virtual ICollection<Option> Options { get; set; }
}

public class Option
{
    public int Id { get; set; }
    public decimal Price { get; set; }
}

从:

public class Quote
{
    public int QuoteId { get; set; }
    public string Type { get; set; }
    public string Destination { get; set; }
    public List<RateSet> RateSets { get; set; }
}


public class RateSet
{
    public int Id { get; set; }
    public decimal ValueMin { get; set; }
    public decimal ValueMax { get; set; }
    public List<Option> Options { get; set; }
}

public class Option
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal? Price { get; set; }
}

我正在接触这个问题,但仍然遇到问题......

newQuotes = Quotes
    .Select(x => new Quote() {
        Id = x.QuoteId,
        Rates = x.RateSets.Select( y => new Rate() {
            Id = y.Id,
            Options = y.Options.Select(z => new Option() {
                Id = z.Id,
                Price = z.Price
            }).ToList(),....

4 个答案:

答案 0 :(得分:2)

编译时没有任何错误

// to
public class Quote2
{
    public int Id { get; set; }
    public string Type { get; set; }
    public virtual ICollection<Rate> Rates { get; set; }
}

public class Rate
{
    public int Id { get; set; }
    public virtual ICollection<Option2> Options { get; set; }
}

public class Option2
{
    public int Id { get; set; }
    public decimal Price { get; set; }
}

// from
public class Quote1
{
    public int QuoteId { get; set; }
    public string Type { get; set; }
    public string Destination { get; set; }
    public List<RateSet> RateSets { get; set; }
}


public class RateSet
{
    public int Id { get; set; }
    public decimal ValueMin { get; set; }
    public decimal ValueMax { get; set; }
    public List<Option1> Options { get; set; }
}

public class Option1
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal? Price { get; set; }
}

void Main()
{
    var Quotes = new List<Quote1>();

    var newQuotes = Quotes
    .Select(x => new Quote2 {
        Id = x.QuoteId,
        Rates = x.RateSets == null ? null : x.RateSets.Select( y => new Rate {
            Id = y.Id,
            Options = y.Options == null ? null : y.Options.Select(z => new Option2 {
                Id = z.Id,
                Price = z.Price.Value
            }).ToList()}).ToList()}).ToList();
}

答案 1 :(得分:1)

我会让它更模块化:

newQuotes = Quotes.Select(x => new Quote
                               {
                                   ID = x.QuoteID,
                                   Type = x.Type,
                                   Rates = ConvertRates(x.RateSets)
                               });

ConvertRates会使用相同的方法来创建子对象,可以是方法还是Func

ICollection<Rate> ConvertRates(IEnumerable<RateSet> oldRates)
{
    return oldRates.Select(x => new Rate
                                {
                                     ID = x.ID,
                                     Options = ConvertOptions(x.Options)
                                }).ToList();
}

基本上,这与您使用的方法相同,只是拆分和可读。

答案 2 :(得分:0)

更简单的方法可能是在每个类中创建将自身转换为其他类型的方法。或者,如果您不想要这种耦合,请创建一个工厂类,为您进行转换,一次一个项目。然后使用link循环并转换每个项目。

像这样:

public class Quote
{
    public int Id { get; set; }
    public string Type { get; set; }
    public virtual ICollection<Rate> Rates { get; set; }

    public static Quote FromData(Data.Quote input){
        if (input == null) return null;
        Quote output = new Quote()
        {
            Id = input.QuoteId,
            Type = input.Type
        };
        output.Rates = (from i in input.RateSets
                        select Rate.FromData(i)).ToList();
    }
}

public class Rate
{
    public int Id { get; set; }
    public virtual ICollection<Option> Options { get; set; }

    public static Rate FromData(Data.RateSet input)
    {
        if (input == null) return null;
        Rate output = new Rate()
        {
            Id = input.Id
        };
        output.Options = (from i in input.Options
                          select Option.FromData(i)).ToList();
        return output;
    }
}

public class Option
{
    public int Id { get; set; }
    public decimal Price { get; set; }

    public static Option FromData(Data.Option input)
    {
        if (input == null) return null;
        Option output = new Option()
        {
            Id = input.Id,
            Price = input.Price ?? 0m
        };
        return output;
    }
}

namespace Data {
    public class Quote
    {
        public int QuoteId { get; set; }
        public string Type { get; set; }
        public string Destination { get; set; }
        public List<RateSet> RateSets { get; set; }
    }


    public class RateSet
    {
        public int Id { get; set; }
        public decimal ValueMin { get; set; }
        public decimal ValueMax { get; set; }
        public List<Option> Options { get; set; }
    }

    public class Option
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal? Price { get; set; }
    }
}

答案 3 :(得分:0)

我认为您需要做的是在每两个相应的类之间定义转换,然后将一个列表转换为另一个。