2016-10-07 4 views
1

私のASP.NET 5 APIプロジェクトで不満を抱いた後、古いWebApi 2プロジェクトとして再構築することにしました。私はLINQクエリからの2つの文字列(もともとは2要素の文字列配列のリスト、現在は文字列のリスト)のリストのリストを生成しようとしています。新しいプロジェクトが何らかの理由で文字列配列を使用して好きではなかったことを理由に、クエリに窒息新しい文字列リストは、LINQの初期化時にリスト要素の順序をシャッフルします。

var testList = db.MyTable.Where(x => [WHERE Clauses]).Select(x => new string[] { x.Number.Trim(), x.Name.Trim() }).ToList(); 

(:ここ

は、私はそれを望んでいたとして、ASP.NET 5プロジェクトで働いていたに擬似コードであります私はEF 6対7の違いを仮定していますか?)。修正として私は代わりにクエリが文字列リストのリストを返すが、それは返される "Number"と "Name"フィールドの順番を混ぜて、時にはNumberが最初の要素であり、Nameが他の時であることもある。ここではすべてがごちゃ混ぜに要素の順序になってしまったことを、私が試したいくつかの新しいクエリコードの試みである:私は私が探している最終的な結果を得るためにさまざまな方法のトンがあります実現

var testList = db.MyTable.Where(x => [WHERE Clauses]).Select(x => new List<string> { x.Number.Trim(), x.Name.Trim() }).ToList(); 
var testList = db.MyTable.Where(x => [WHERE Clauses]).Select(x => (new string[2] { x.Number.Trim(), x.Name.Trim() }).ToList()).ToList(); 
var testList = db.MyTable.Where(x => [WHERE Clauses]).Select(x => new List<string>(new string[] { x.Number.Trim(), x.Name.Trim() })).ToList(); 

が、私は願っています誰かが、私が注文を完全に以前に保存していた新しく作成された配列に基づいてリストを生成した場合でも、なぜこれらのリスト要素が異なる注文(場合によっては名前、次に別の番号、名前、名前)でリストに配置される理由を理解するのを助けることができます。

+0

だが終了した後にデータが構成されているかを心配することができます。あなたはあなたのデータが正しいと確信していますか?これを再現できますか?毎回同じ行が間違っていますか? 'Select'の前に' .ToList()。 'をつけるとどうなりますか? – Blorgbeard

+2

Blorgbeard氏によると、データが間違っている可能性が高いようです。しかし、配列やリストを選択すると、EFにとってはまれなケースです。おそらく、あなたは端を覆うケースを見つけました。これを試してください: 'var testList = db.MyTable.Where(x => [WHERE句])Select(x => new {Number = x.Number.Trim()、Name = x.Name.Trim()}) .AsEnumerable()。Select(x => new List {x.Number、x.Name})。ToList(); '。 * EFが作業を終えた後に*リストが作成されます。それでも値が正しくない場合は、データが不良であることがほぼ確実です。 – Rob

+0

データは間違いなく、Great Plains 2015 ERPソフトウェアのマスター顧客テーブルの顧客レコードです。このデータが悪いと、会社全体が混乱してしまいます。私は確かにそれについて聞いていますし、元の文字列配列コード。 @ロブあなたの提案は、問題を解決しました。なぜなら、LINQクエリがそれを修正した後にリストを構成する理由が何であれ、それを回答として掲示しています。私は何が起こっていたのか知​​りたかったのですが、私は働くコードを勝利のように受け取ります、ありがとう! –

答えて

2

私はこれらのクエリに対してどのようなSQLが生成され、結果が変わったときに変更されるかどうか知りたいのです。私にリストを選択することは非常にまれな状況だと思われますので、あなたはエッジケース(または少なくとも定義されていない動作領域)に遭遇した可能性があります。

あなたはまだ、基本的にちょうど2つの列を選択しているので、我々は、Entity Frameworkは、それはかなり考えにくい仕事

db.MyTable.Where(x => [WHERE Clauses]) 
    .Select(x => new { Number = x.Number.Trim(), Name = x.Name.Trim() }) 
    .AsEnumerable() //Force EF to materialize the result here 
    .Select(x => new List<string> { x.Number, x.Name }) //Manipulate the result in memory 
    .ToList(); 
関連する問題