0

私は次のコードを持っており、ifステートメントを使用して変更する必要があります。これが私が今持っているものです:

 var result = (from fs in ctx.datFiles
                      where fs.File_ID == fID
                      select new
                      {
                          LastName = fs.datClaim.LastName,
                          FirstName = fs.datClaim.FirstName,
                      }).FirstOrDefault();



    DetailsModelView dmv = new DetailsModelView
    {
        ClaimID = result.ClaimID,
        LastName = result.LastName,
        FirstName = result.FirstName,

    };

私は次のようなことをしたい:

var result =""

if (something)
{
result = (from fs in ctx.datFiles
                          where fs.File_ID == fID
                          select new
                          {
                              LastName = fs.datClaim.LastName,
                              FirstName = fs.datClaim.FirstName,
                          }).FirstOrDefault();

}
else
{
result = (from fs in ctx.datFiles
                          where fs.File_ID == 5
                          select new
                          {
                              LastName = fs.datClaim.LastName,
                              FirstName = fs.datClaim.FirstName,
                          }).FirstOrDefault();
}

        DetailsModelView dmv = new DetailsModelView
        {
            ClaimID = result.ClaimID,
            LastName = result.LastName,
            FirstName = result.FirstName,

        };

しかし、次のエラーが発生し続けます。LINQステートメントの外部で「結果」を作成しようとすると、タイプ「AnonymousType#1」を「文字列」に暗黙的に変換できません。

文字列ではなく、結果を機能させるために何を宣言する必要がありますか?

これは単純な例でした。私のクエリは、IDの変更よりも「else」の方がはるかに複雑になります。

4

7 に答える 7

4

機能する関数プログラムは次のとおりです。

var foo = new {LastName = "", FirstName=""};;

int bar = 1;

if (bar==1)
{
    foo = new {LastName = "test1", FirstName="test2"};
}
else
{
    foo = new {LastName = "test3", FirstName="test4"};
}

ご覧のとおり、作成するオブジェクトを が認識できるように、ダミーの匿名オブジェクトを作成しましたvar foo。これは明らかに、if ステートメントの 2 つのブランチで作成しているのと同じ無名オブジェクトである必要があります。

DetailsModelView上記のコードでは、匿名型ではなくlinqで直接使用しない理由はないように思われることにも注意してください。ユースケースはより複雑かもしれませんが、単純な 1 対 1 のマッピングがあるためDetailsModelView、現在匿名メソッドを作成している場所を作成するだけです。次に、結果を として定義することができますDetailsModelView

于 2013-01-08T14:30:52.643 に答える
1

他の人が言ったように、その値をlinq結果に設定しようとすると、文字列としてキャストしようとするのとvar result = "";同じです。string result = "";

実際のコードがどのように設計されているかに応じて、匿名型を返すのではなく、FirstName、LastName プロパティを使用して単純型を宣言することができます。同様に、常に LINQ 呼び出しの結果を使用して DetailsModelView のインスタンスを作成する場合は、結果変数を宣言DetailsModelView result = null;し、コードで匿名型ではなく DetailsModelView を返すことができます。最後に、新しいプロパティをインスタンス化するのではなく、DetailsViewModel (存在する場合) で追加のプロパティを指定するだけです。

DetailsViewModel result = null;

if (something)
  result = ;// LINQ Query
else
  result = ;// LINQ Query
于 2013-01-08T14:37:30.377 に答える
1

結果の後var result =""はすでに文字列です。

どうですか:

int id;
if(something)
{
    id = fID;
}
else
{
    id = 5;
}

var result = (from fs in ctx.datFiles
                          where fs.File_ID == id
                          select new
                          {
                              LastName = fs.datClaim.LastName,
                              FirstName = fs.datClaim.FirstName,
                          }).FirstOrDefault();
于 2013-01-08T14:25:06.243 に答える
0

ここでは、Linq プロジェクションはまったく必要ありません。

編集-しかし、Servyが指摘したように、これがORM呼び出しである場合、おそらくそれが必要です。つまり、プロジェクションが必要です。

また、null を返す場合、コードは null ref 例外をスローしFirstOrDefaultます。

int searchId = fId;

if(something)
    searchId = fId;
else
    searchId = 5;

var result = ctx.datFiles.FirstOrDefault(fs => fs.File_ID == searchId)
               .Select(fs=> new 
                 {
                   Id = fs.datClaim.Id,
                   LastName = fs.datClaim.LastName,
                   FirstName = fs.datClaim.FirstName,
                 });

if(result == null)
    throw new Exception(); // if there is no result your code will throw!

DetailsModelView dmv = new DetailsModelView
{
    ClaimID = result.Id,
    LastName = result.LastName,
    FirstName = result.FirstName,
};
于 2013-01-08T14:29:44.970 に答える
0

匿名型にキャストする方法を説明する記事は次のとおりです: http://toasp.net/blog/cannot-return-anonymous-type-from-method.aspx

C# の匿名型の機能の 1 つは、それらに同じデータが含まれている場合、後で参照できるように型が再利用されることです。この場合、型にキャストできます。

これがここでの最善の解決策かどうかはわかりませんが、うまくいくはずです。

于 2013-01-08T14:39:54.013 に答える
-1

var result = "";に変更

var result = new
{
    LastName = "",
    FirstName = "",
};
于 2013-01-08T14:26:09.787 に答える
-2

変化する

var result = "";

var result;

LINQステートメントの外で作成するときは、キャストするようにしてください

DetailsModelView
于 2013-01-08T14:40:20.800 に答える