0

baswareCatalog.FlowCurrent と baswareCatalog.Doc の 2 つのテーブルがあります。どちらにも属性 DocId が含まれています。Doc-table には属性 LastExpireDate と Status もあります。FlowCurrent-table には属性 RecipientName もあります。項目の DocId が両方のテーブルで同じである Doc のコレクションを取得したいと考えています。

さらに、次の条件が真である必要があります: flowCurrent.RecipientName.Contains(userFullName)

以下を試してみましたが、正しいかどうかわかりません。

var docitemIQueryable = from flowCurrent in baswareCatalog.FlowCurrent join 
                        document in baswareCatalog.Docs on 
                        flowCurrent.DocId equals document.DocId 
                        where flowCurrent.RecipientName.Contains(userFullName) 
                        select new
                        {
                          Items = baswareCatalog
                                  .Docs
                                  .Where(b => b.DocId == flowCurrent.DocId)
                        };

戻り値は

'interface System.Linq.IQueryable<out T>'.
T is 'a' 
Anonymous Types: 'a is new {IQueryable<Doc> Items }'

繰り返し処理できる Doc のコレクションを取得するにはどうすればよいですか?

4

3 に答える 3

1

2つのこと:

  1. System.Linq.IQueryable反復できるコレクションです。foreachループに入れたり、好きなことをしたりできます。または.ToList()、すぐに実現したい場合に使用できます。
  2. クエリで行う必要のない余分な作業を行っています。FlowCurrentと の間で結合を行っていDocsますが、結果を取得してすぐに戻っていDocsます。その必要はありません。

あなたが気にかけているのは にあるものだけだと仮定してDocs、これを試してください:

var docitemIQueryable = from flowCurrent in baswareCatalog.FlowCurrent 
                        join document in baswareCatalog.Docs on 
                            flowCurrent.DocId equals document.DocId 
                        where flowCurrent.RecipientName.Contains(userFullName) 
                        select document;

これにより、すべてのフィールドが含まれる行のコレクションが得られますDocs。いくつかのものも必要な場合は、FlowCurrent次のようなことを行う必要があります。

var docitemIQueryable = from flowCurrent in baswareCatalog.FlowCurrent 
                        join document in baswareCatalog.Docs on 
                            flowCurrent.DocId equals document.DocId 
                        where flowCurrent.RecipientName.Contains(userFullName) 
                        select new {
                            document.DocId, flowCurrent.blahblah, ...
                        };
于 2012-11-30T16:40:12.043 に答える
1

テーブル構造についての知識がなくても、クエリは問題ないように見えます。「select」の時点で、2 つのテーブルが結合され、where 句によって制限されます。

select new 内で、含めたい元のテーブルのプロパティを新しいオブジェクトに割り当てることができます。

select new
{
    DocId = flowCurrent.DocId,
    LastExpireDate = document.LastExpireDate,
    //etc
}

ドキュメントアイテムを取得したいだけの場合は、これを行うことができます

var docitemIQueryable = from flowCurrent in baswareCatalog.FlowCurrent join 
                    document in baswareCatalog.Docs on 
                    flowCurrent.DocId equals document.DocId 
                    where flowCurrent.RecipientName.Contains(userFullName) 
                    select document;

そして、ドキュメントのqueryableがあります

于 2012-11-30T16:37:55.500 に答える
0

結果は items プロパティ内のオブジェクトのシーケンスになるため、ネストされたループまたは SelectMany が必要です

foreach(var item in docitemIQueryable.SelectMany( x=> x.Items)){
   //do something
}

ただし、内部選択は 1 つの要素のみを返すようです。その場合、匿名型オブジェクトをスキップして、以下のように選択するだけです。

select document;

ループを単純化して

foreach(var item in docitemIQueryable){
   //do something
}
于 2012-11-30T16:41:46.587 に答える