web-dev-qa-db-ja.com

IQueryable変数に新しいレコードを追加するにはどうすればよいですか?

IQueryableの結果は、LINQを使用して私のデータベースからクエリされます。IQueryableの結果に新しいレコードを追加するにはどうすればよいですか。

28
silent200

それをデータベースに追加しますか、それともデータバインディングなどの他のものが使用する結果のリストに追加しますか?

前者の場合は、使用しているLINQの種類にかかわらず、通常の追加操作を使用する必要がありますが、IQueryableではなくテーブル表現に使用します。クエリはデータのみを読み取ります。

後者の場合は、 Enumerable.Concat を使用して、既存のシーケンス(IQueryable)を追加のエントリ(ここでは配列で十分ですが、リスト)を含む新しいシーケンスと連結し、その結果を使用します。バインディングなどのため。Queryableの代わりにEnumerableが使用されていることを確認するために、最初にAsEnumerable()を使用する価値があるでしょう。例えば:

IQueryable<string> names = [...];
names = names.AsEnumerable().Concat(new[] { "(None)", "(Add new)" });
38
Jon Skeet

最初にリストに変換する必要があります。

IQueryable<int> foo = new SomeQueryable<int<();
List<int> list = foo.ToList();
list.Add(5);

または連結を使用する

IQueryable<int> foo = new SomeQueryable<int<();
foo = foo.Concat(new int[]{5});

編集:fooを再割り当てする必要があることを確認してください。

14
Ali Ersöz

簡単な答えは、Iqueryableがクエリしている基になるデータストアにレコードを追加しない限り、できない IQueryableに新しいレコードを追加することです。したがって、LinqToSqlを使用している場合は、IQueryableに行を「追加」するために、IQueryableがクエリを行っていたテーブルに行を追加する必要があります。

IQueryableは結果セットではなく、クエリであることに注意してください。 .ToList()のようなものを使用するまで、IQueryableは結果セットを評価せず、さらに重要なことに、IQueryableはその結果セットに依存しません。リストを作成し、代わりに結果を入れます。つまり、IqueryableでToList()を2回呼び出すと、オフになり、データベースを2回クエリします。それが非効率的であるかもしれないことは気にしません。

したがって、他のユーザーが上で使用した例を見ると、AsEnumerable()をToList()に変更するだけで問題が解決する可能性が高くなります。

何かのようなもの:

dcDataContext db = new dcDataContext();
var query = from c in db.tblSexes
              select new { c.SexCode, c.SexName };

var results = query.ToList().Concat(new[] { new { SexCode = -1, SexName = "Please select your Gender" } });

//or even better now that it's a list
var results = query.ToList().Add(new { SexCode = -1, SexName = "Please select your Gender" });

SelectList sliSex = new SelectList(results, "SexCode", "SexName");
5
Jero

非常に古い質問かもしれませんが、ここに説明とサンプルを追加したいと思います

IQueryable<YourObject>を使用する場合は、最初にIEnumerable<YourObject>に変換する必要があります

iEnumerableに関する詳細:

IEnumerable <T>とIQueryable <T>を返す

沿って

IQueryable<YourObject> iqueryResult = // ..... your LinQ or whatever
IEnumerable<YourObject> enumResult = iqueryResult.AsEnumerable();

次に、追加するには、

enumResult = enumResult.Concat(new[] {new YourObject()
                 { 
                    //.... 
                 } 
             });

実際のコードのサンプル

var iquery_QRDTR = from rrp in P_QCDTR
        select new WebRequestData
        {
             ros_chk_id = rrp.CHECKIN_ID,
             ros_img = rrp.EMPLOYEE_ASSOCIATE.IMAGE_URL
        };

var enum_QRDTR = iquery_QRDTR.AsEnumerable();

enum_QRDTR = enum_QRDTR.Concat(new[] {new WebRequestData()
             {
             ros_chk_id = 16,
             ros_img = "http://link.to.image/profile.jpg" 
             } });
3
Sruit A.Suk

これを試して:

var query = from c in db.clClinics select c; 

var results = query.ToList().Concat(new clClinic[] { new clClinic()});  
1
ayman

ユニオンを使用できます

IQueryable<int> foo = new SomeQueryable<int>();
IQueryable<int> foo2 = new SomeQueryable<int>();
foo = foo.Union(foo2);
0
Nurlan T

匿名型のプロパティを明示的に設定します。これを試して:

dcDataContext db = new dcDataContext();
var results = from c in db.tblSexes
              select new { c.SexCode, c.SexName };
results = results.AsEnumerable().Concat(new[] { new { SexCode = -1, SexName = "Please select your Gender"} });
SelectList sliSex = new SelectList(results, "SexCode", "SexName");

編集:プロパティの正確なタイプを指定する必要があります。つまり、それがintである場合、それが正しいことを指摘する必要があります。 SexCodeは「long」で、デフォルトでは-1は「int」です。 -1をlong(またはSexCodeのタイプ)にキャストすると、問題は解決されます。

SexCodeの型が長い場合の正確な解決策を次に示します。

dcDataContext db = new dcDataContext();
var results = from c in db.tblSexes
              select new { c.SexCode, c.SexName };
results = results.Concat(new[] { new { SexCode = -1L, SexName = "Please select your Gender"} });
SelectList sliSex = new SelectList(results, "SexCode", "SexName");
0
Ali Ersöz

結果はIQueryableなので、キャストする必要があります

  dcDataContext db = new dcDataContext();
var results = from c in db.tblSexes
              select new { c.SexCode, c.SexName };
results = results.AsEnumerable().Concat(new[] { new { SexCode = -1, SexName = "Please select your Gender"} }).AsQueryable();
SelectList sliSex = new SelectList(results, "SexCode", "SexName");

またはキャストなし

results = results.Union(new [] {new {SexCode = -1、SexName = "性別を選択してください"}})

0
Dincer Uyav