LINQとサブソニック - ネストした複雑なタイプを返す
-
16-09-2020 - |
質問
LINQにも亜音声と合理的に新しいことが新しいので、私はちょうど少しアプリを一緒に置くことを試みています。
テンプレートがすべて並べ替えて大丈夫ですが、このLINQステートメントでは少しの問題に遭遇しました(少し単純化されている、Real Statementは他のどのような問題には影響しません。私はそれらを簡潔にしました):
var addresses = from address in Database.Addresses.All()
select new Address()
{
MyNestedType = new NestedType()
{
Field1 = address.ADDR1
}
};
.
この文を実行すると、「System.String」から 'NestedType'へのエラーが無効になっています。の結果を列挙しようとします。
私はおそらく明らかだのを見下ろすのですが、私はそのような変換を要求する場所がわかりません。
field1 と address.addr1 の両方は文字列です。
私が間違っていることは何ですか?
編集:
これをもう一度見て、より多くの情報を提供するための努力で、私はSimpleRepositoryとSQLiteデータベースを使用して小さな完全な例を作成しました。 SimpleRepositoryを使用すると、Error I Getが異なります(シーケンスには要素が含まれていません)が同じです。これが完全なコードです:
public class DatabaseAddress
{
public int Id { get; set; }
public string Address1 { get; set; }
}
public class Address
{
public NestedType MyNestedType;
}
public class NestedType
{
public string Field1 { get; set; }
}
static class Program
{
[STAThread]
static void Main()
{
var repo = new SimpleRepository("Db", SimpleRepositoryOptions.RunMigrations);
DatabaseAddress address1 = new DatabaseAddress();
address1.Address1 = "Test";
repo.Add(address1);
var all = repo.All<DatabaseAddress>();
var addresses = from address in repo.All<DatabaseAddress>()
select new Address { MyNestedType = new NestedType { Field1 = address.Address1 } };
}
}
.
この例では、all
にはデータベースに追加されたオブジェクトが含まれていますが、addresses
は "Sequenceに要素が含まれていません"を返します。
select
文の具体的な型の代わりに匿名型を使用する場合は機能します。
ここで私の知る限りでは明らかにギャップがあります。あらゆる助けがあります。
解決
Tolist()を呼び出す必要があります。そうしないと、サブソンプロバイダーはMyNestedTypeで何かをしようとし、データベースには存在しません。
var addresses = from address in repo.All<DatabaseAddress>().ToList()
select new Address { MyNestedType = new NestedType { Field1 = address.Address1 } };
.
アップデート:後でTolistを呼び出す場合は、それも機能します。:
addresses.ToList().ForEach(address => Console.WriteLine("Address.MyNestedType.Field1 = {0}", address.MyNestedType.Field1));
.
サブソンクエリプロバイダには、匿名型のために機能するため、匿名の種類のためにバグがあると思います。
他のヒント
これを試してみてください
var nestedTypes= from address in Database.Addresses.All()
select new NestedType()
{
Field1 = address.ADDR1
};
.