C# 尝试将项添加到c中的linq select语句

C# 尝试将项添加到c中的linq select语句,c#,linq,C#,Linq,我在linq中有一个很长的结果集,它放在ratestest中,我正在将结果映射到ChargeElementsAllable。问题是这不包括收费记录,因为 var fees = (from r in _dbContext.Rates where r.RateTypeFK == RateType.Fee && (r.LocaleBW & localeid) > 0 && (r.PolicyBW & polic

我在linq中有一个很长的结果集,它放在ratestest中,我正在将结果映射到ChargeElementsAllable。问题是这不包括收费记录,因为

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);
所以我想将费用添加到ratestest,我可以再次进行映射,这样我就可以使用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();

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

然后在select子句中调用use this model,并直接将此模型分配给表

现在,让我们使用您的代码并更改如下选择:

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();

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

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在评论中正确指出的,相同的顺序是不必要的。

添加意味着连接两个序列?是的,我的意思是连接,谢谢什么类型是quoteInputs?它来自哪里?单独的表格?如何选择费用属性?到目前为止,我有这个。。{var modeltest=new Model1{quoteInputs=quoteInputs,fees=fee};var rates=modeltest中的qi。quoteInputs在{u dbContext.rates on qi.RatePK等于r.RatePK}中加入r,这是一个输入错误。您可以像这样选择:选择新模型1{quoteInputs=qi,fees=fee,…}是正确的。您只需要将更多表的属性添加到模型中,然后直接从联接中选择完整的表。这就是你的意思,你是说费属性被当作另一个连接使用?但是我尝试了一个独立的费用记录。我很确定你不需要在这里按相同的顺序使用这些属性。如果它是一个匿名对象,这可能是另一个问题,但由于我们正在创建一个IEnumerable,那么重要的是它们都是相同的类型。不,我想避免将费用单独映射到ChargeElement,因为这是20多行代码。我只是想以某种方式将其添加到我的ratestest select中。@Luke好的,那么,您能提供数据库结构的最小示例吗?我相信这将有助于创建一个您正在寻找的查询。@Chris thx,请更正。我记得在使用Linq2Sql和Concat时有困难。在两个查询中填充所有属性就解决了这个问题,即使我使用了带有特定类型的select。您选择不同表的方式非常好!!谢谢
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);