3

連結したい同じ ViewModel の 2 つのインスタンスがあります。

var queryNew = from a in ICDUnitOfWork.AlphaGroups.Find()
                           join e in ICDUnitOfWork.Alphas.Find()
                               on a.AlphaGroupID equals e.AlphaGroupID into g
                           join c in ICDUnitOfWork.Codes.Find()
                               on a.CodeID equals c.CodeID into co
                           select new HomeSearchViewModel
                                      {
                                          Alphas = g,
                                          AlphaGroups = a,
                                          AlphaGroupCode = co.FirstOrDefault(),
                                          SearchTerm = searchTerm,
                                          AlphasCodes = null
                                      };

var codequery = from a in ICDUnitOfWork.Alphas.Find()
                join c in ICDUnitOfWork.Codes.Find()
                on a.CodeID equals c.CodeID into g
                select new HomeSearchViewModel
                       {
                          AlphasCodes = g
                       };

var allResults = queryNew.Concat(codequery);

これにより、次のエラーが表示されます。

タイプ 'ICD.ViewModels.HomeSearchViewModel' は、単一の LINQ to Entities クエリ内の構造的に互換性のない 2 つの初期化に表示されます。型は、同じクエリの 2 つの場所で初期化できますが、同じプロパティが両方の場所で設定され、それらのプロパティが同じ順序で設定されている場合に限ります。

これらの結果を結合するにはどうすればよいですか?

4

5 に答える 5

1

まあ、解決策は私の側では本当にばかげていました。結合しようとしていたテーブルにナビゲーション プロパティを追加しましたが、すべてが機能しています。

おっと!

于 2012-11-16T23:17:15.427 に答える
0

2つのクエリとして実行してもかまわない場合、呼び出しAsEnumerable()は問題なくローカルメモリに連結されます。

var result = queryNew.AsEnumerable().Concat(codequery); 

ここAsEnumerable()でも、クエリの実行は延期されます(これは、コードが示唆しているようです)。ただし、すぐに実行したい場合は、Arthurが提案するように実行し、キャッシュ関数を呼び出しますToList()ToArray()

于 2012-11-16T19:14:58.017 に答える
0

「ToList()」のようなものを呼び出して、事前にクエリを評価してみることができます。

var allResults = queryNew.ToList().Concat(codequery.ToList());
于 2012-11-16T19:09:41.113 に答える
0

他のすべてのプロパティを null で埋める必要があります

var codequery = from a in ICDUnitOfWork.Alphas.Find()
                join c in ICDUnitOfWork.Codes.Find()
                on a.CodeID equals c.CodeID into g
                select new HomeSearchViewModel
                       {
                          Alphas = null,
                          AlphaGroups = null,
                          AlphaGroupCode = null,
                          SearchTerm = null,
                          AlphasCodes = g
                       };

var allResults = queryNew.Concat(codequery);
于 2014-11-12T14:34:27.413 に答える
0

Concat単純なforループで十分なはずです。AlphaGroupCodeクエリの外観から、マッピングの一意の識別子として を使用できる可能性があります。

var codequery = ...
                select new HomeSearchViewModel
                {
                    AlphaGroupCode = c.FirstOrDefault()
                    AlphasCodes = g
                };

foreach (var q in queryNew)
{
    q.AlphaCodes = codequery.Where(x => x.AlphaGroupCode == q.AlphaGroupCode)
                            .FirstOrDefault()
                            .AlphaCodes;
}
于 2012-11-16T18:13:03.497 に答える