简体   繁体   中英

LINQ using dictionary in where clause

er have the following query in linq...

Whenever I try to run it I get a No comparison operator for type System.Int[] exception.

It's got something to do with the dictionary I am sure, but I don't understand why this isn't valid and was wondering if someone could explain?

// As requested... not sure it will help though.
var per = (
    from p in OtherContext.tblPeriod 
    where activeContractList.Select(c => c.DomainSetExtensionCode).Contains(p.DomainSetExtensionCode) 
    select p).ToArray();

var com = (
    from c in MyContext.tblService 
    join sce in MyContext.tblServiceExtension
    on c.ServiceExtensionCode equals sce.ServiceExtensionCode
    join sc in MyContext.tblServiceContract
    on sce.ServiceContractCode equals sc.ContractCode
    group sc by c.Period into comG
    select new
    {
        PeriodNumber = comG.Key,
        Group = comG,
    }).ToArray();

var code =
    (from c in com
    join p in per on c.PeriodNumber equals p.PeriodNumber
    select new
    {
        p.Code, 
        c.Group
    }).ToArray();

var payDictionary = new Dictionary<int, int[]>();

// This is another linq query that returns an anonymous type with
// two properties, and int and an array.
code.ForEach(c => payDictionary.Add(c.Code, c.Group.Select(g => g.Code).ToArray()));

// MyContext is a LINQ to SQL DataContext
var stuff = (
from
    p in MyContext.tblPaySomething
    join cae in MyContext.tblSomethingElse
    on p.PaymentCode equals cae.PaymentCode
    join ca in MyContext.tblAnotherThing
    on cae.SomeCode equals ca.SomeCode
where
    // ca.ContractCode.Value in an int?, that should always have a value.
    payDictionary[p.Code].Contains(ca.ContractCode.Value)
select new
{
    p.Code,
    p.ExtensionCode,
    p.IsFlagged,
    p.Narrative,
    p.PayCode,
    ca.BookCode,
    cae.Status
}).ToList();

You won't be able to do this with a dictionary. The alternative is to join the three linq queries into one. You can do this with minimal impact to your code by not materializing the queries with ToArray . This will leave com and code as IQueryable<T> and allow for you compose other queries with them.

You will also need to use a group rather than constructing a dictionary. Something like this should work:

var per = (
    from p in OtherContext.tblPeriod 
    where activeContractList.Select(c => c.DomainSetExtensionCode).Contains(p.DomainSetExtensionCode) 
    select p.PeriodNumber).ToArray(); // Leave this ToArray because it's materialized from OtherContext

var com = 
    from c in MyContext.tblService 
    join sce in MyContext.tblServiceExtension on c.ServiceExtensionCode equals sce.ServiceExtensionCode
    join sc in MyContext.tblServiceContract on sce.ServiceContractCode equals sc.ContractCode
    group sc by c.Period into comG
    select new
    {
        PeriodNumber = comG.Key,
        Group = comG,
    }; // no ToArray

var code =
    from c in com
    where per.Contains(c.PeriodNumber) // have to change this line because per comes from OtherContext
    select new
    {
        Code = c.PeriodNumber, 
        c.Group
    }; // no ToArray

var results = 
    (from p in MyContext.tblPaySomething
     join cae in MyContext.tblSomethingElse on p.PaymentCode equals cae.PaymentCode
     join ca in MyContext.tblAnothThing on cae.SomeCode equals ca.SomeCode
     join cg in MyContext.Codes.GroupBy(c => c.Code, c => c.Code) on cg.Key equals p.Code
     where cg.Contains(ca.ContractCode.Value)
     select new
     {
         p.ContractPeriodCode,
         p.DomainSetExtensionCode,
         p.IsFlagged,
         p.Narrative,
         p.PaymentCode,
         ca.BookingCode,
         cae.Status
     })
    .ToList();

Side Note: I also suggest using navigation properties where possible instead of joins. It makes it much easier to read and understand how objects are related and create complex queries.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM