IQueryableの結果は、LINQを使用してデータベースからクエリされます。IQueryableの結果に新しいレコードを追加するにはどうすればよいですか。
8 に答える
それをデータベースに追加しますか、それともデータバインディングなどの他のものが使用する結果のリストに追加しますか?
前者の場合は、使用している LINQ の種類に関係なく、IQueryable ではなくテーブル表現に対して通常の追加操作を使用する必要があります。クエリはデータの読み取りのみを行います。
後者の場合は、Enumerable.Concatを使用して既存のシーケンス (IQueryable) を追加のエントリを含む新しいシーケンス (ここでは配列またはリストで十分です) と連結し、結果をバインドなどに使用します。おそらく価値があります。最初に AsEnumerable() を使用して、Queryable の代わりに Enumerable が使用されるようにします。例えば:
IQueryable<string> names = [...];
names = names.AsEnumerable().Concat(new[] { "(None)", "(Add new)" });
最初にリストに変換する必要があります。
IQueryable<int> foo = new SomeQueryable<int<();
List<int> list = foo.ToList();
list.Add(5);
または Concat を使用して
IQueryable<int> foo = new SomeQueryable<int<();
foo = foo.Concat(new int[]{5});
編集:必ず foo を再割り当てする必要があります。
簡単な答えは、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");
非常に古い質問かもしれません。ここに説明とサンプルを追加したいと思います
を使用する場合は、最初IQueryable<YourObject>
に変換する必要がありますIEnumerable<YourObject>
IEnumerable に関する追加の詳細:
に
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"
} });
これを試して:
var query = from c in db.clClinics select c;
var results = query.ToList().Concat(new clClinic[] { new clClinic()});
匿名型のプロパティを明示的に設定します。これを試して:
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 である場合、それが 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");
結果は 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 = "性別を選択してください"} })