1

er linq に次のクエリがあります...

実行しようとするたびに、No comparison operator for type System.Int[]例外が発生します。

それは確かに辞書と関係がありますが、なぜこれが有効でないのか理解できず、誰かが説明できるかどうか疑問に思っていましたか?

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

1 に答える 1

1

これは辞書ではできません。別の方法は、3 つの linq クエリを 1 つに結合することです。でクエリを具体化しないことで、コードへの影響を最小限に抑えてこれを行うことができますToArray。これによりcom、 and codeasIQueryable<T>が残り、それらを使用して他のクエリを作成できるようになります。

groupまた、辞書を作成するのではなく、a を使用する必要があります。このようなものが動作するはずです:

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

補足:可能であれば、結合の代わりにナビゲーション プロパティを使用することもお勧めします。オブジェクトがどのように関連しているかを読んで理解し、複雑なクエリを作成するのがはるかに簡単になります。

于 2013-04-09T15:41:52.050 に答える