尝试在c#

时间:2017-07-25 10:11:47

标签: c# linq

我在linq中有一个很长的结果集,它被放入ratestest中,我将结果映射到ChargeElementsNullable。问题是这不包括费用记录

var fees = (from r in _dbContext.Rates
                   where r.RateTypeFK == RateType.Fee && (r.LocaleBW & localeid) > 0 && (r.PolicyBW & policy.BitWise) > 0 && r.RateExclude == 0
                   select r);

所以我想为ratetest添加费用,我可以再次进行映射,所以我可以使用add方法,但是我不想只为一条记录做那个长卷的映射..我想把它添加到ratestest直接反而..但没有快乐...我尝试使用DefaultIfEmpty期待左连接..但费用仍然不在那里..

var ratestest = (from qi in quoteInputs                         
                     join r in _dbContext.Rates on qi.RatePK equals r.RatePK
                     join fee in fees on r.RatePK equals fee.RatePK into feecontainer
                     from fee in feecontainer.DefaultIfEmpty()
                     join c in _dbContext.Covers on r.CoverCalcFK equals c.CoverPK into covers
                     from c in covers.DefaultIfEmpty()
                     join rt in _dbContext.RateTypes on qi.RateTypeFK equals rt.RateTypePK
                     where rt.Ratable == 1 ||
                     rt.RateTypePK == RateType.PostCode ||
                     rt.RateTypePK == RateType.Fee// employersliab.Contains(r.InputFK)
                     select new ChargeElementsNullable
                     {
                         PolicyFK = quote.PolicyFK,
                         InputFK = r.InputFK,
                         LongRate = r.LongRate,
                         RateLabel = r.RateLabel,
                         CoverName = c.CoverName,
                         CoverFK = r.CoverCalcFK,
                         CoverBW = c.BitWise,
                         ListRatePK = r.ListRatePK,
                         RatePK = r.RatePK,
                         RateName = r.RateName,
                         Rate = r.Rate,
                         Threshold = r.Threshold,
                         Excess = r.Excess,
                         DivBy = r.DivBy,
                         DiscountFirstRate = r.DiscountFirstRate,
                         DiscountSubsequentRate = r.DiscountSubsequentRate,
                         HazardRating = r.HazardRating,
                         TableFirstColumn = r.TableFirstColumn,
                         TableChildren = r.TableChildren,
                         RateTypeFK = r.RateTypeFK,
                         PageNo = r.PageNo,
                         SumInsured = qi.SumInsured,
                         NoItems = qi.NoItems,
                         RateValue = qi.RateValue,
                         TriggerCode = rt.TriggerCode,
                         Territory = territory
                     }).ToList();

2 个答案:

答案 0 :(得分:1)

您必须创建一个具有两个属性的模型,一个用于quoteInputs,另一个用于费用。然后你只需要选择它们。 例如:

class model1 
{
     public QuoteInputs quoteInputs {get;set;}
     public Fees fees{get;set;}    
}

然后调用select子句中使用此模型并直接分配此模型表。

现在让我们接受您的代码并更改选择如下:

var ratestest = (from qi in quoteInputs                         
                 join r in _dbContext.Rates on qi.RatePK equals r.RatePK
                 join fee in fees on r.RatePK equals fee.RatePK into feecontainer
                 from fee in feecontainer.DefaultIfEmpty()
                 join c in _dbContext.Covers on r.CoverCalcFK equals c.CoverPK into covers
                 from c in covers.DefaultIfEmpty()
                 join rt in _dbContext.RateTypes on qi.RateTypeFK equals rt.RateTypePK
                 where rt.Ratable == 1 ||
                 rt.RateTypePK == RateType.PostCode ||
                 rt.RateTypePK == RateType.Fee// employersliab.Contains(r.InputFK)
                 select new model1{
                    quoteInputs   = qi,
                    fees = fee
               }).ToList();

答案 1 :(得分:0)

正如您在评论中提到的,您正在寻找Concat方法(MSDN)。这可以这样做:

var fees = from ...
           select new ChargeElementsNullable {
                Prop1 = (some value),
                Prop2 = (other value)
            }

var ratestest = from ...
           select new ChargeElementsNullable {
                Prop1 = (some value),
                Prop2 = (other value)
            }

var bothtogether = fees.Concat(ratestest);

确保所有属性完全相同的顺序所有属性都在 中选择。否则Linq2Sql在获取结果时将失败。 (我从你的代码中假设你正在使用它)

正如@Cris在评论中正确指出的那样,不需要相同的顺序。