2016-06-29 13 views
1

ラムダ式のを使用するLINQクエリ式の新機能です。私は別のテーブルの値を更新したい1つの方法があります。 単一またはデフォルトで正常に動作していますが、Wh​​ere条件を使用しているときは正常に動作していません。LINQラムダ式の条件

public static void UpdateData(int UserID) 
{ 
    using (var objEntity = new DataContext()) 
    { 

     UserMaster objUser = objEntity.UserMasters.SingleOrDefault(TBL => TBL.UserID == UserID); 
     UserOfferUsed objUserUsed = objEntity.UserOfferUseds.Where(TBL => TBL.UserID == UserID); 
     objUser.Purchaseon = DateTime.Now.ToString("dd MMMM yyyy"); 
     objUserUsed.UsedCoupon = 0; 
     objEntity.SaveChanges(); 
     objData = null; 
    } 
} 

エラー:暗黙的 にタイプ 'System.Linq.IQueryable' を変換できません 'Database.UserOfferUsed'。明示的な変換は、(あなた キャストが欠けている?)が存在

答えて

4

.Whereは、(必要な結果は、単一のアイテムである場合)の結果を得るために.SingleOrDefaultまたは.FirstOrDefaultを使用し、ここでIQueryableを返します。結果に複数の要素が含まれる場合は.ToList()を使用できます。あなたがあるList<UserOfferUsed>としてobjUserUsedを変更する必要がある場合は、あなたのコードは次のようになります:

UserOfferUsed objUserUsed = objEntity.UserOfferUseds.FirstOrDefault(TBL => TBL.UserID == UserID); 

など

あなたはあなたの条件に応じて上記のいずれかを選択することができ

List<UserOfferUsed> objUserUsed = objEntity.UserOfferUseds.Where(TBL => TBL.UserID == UserID).ToList(); 

この;

更新:UserIDは、クエリが複数の結果が得られないので、その後.FirstOrDefault()が最良の選択肢となり、リスト内の各要素に対して一意である場合(場合FirstOrDefault()がnull与えるので、あなたが、あまりにもnullを考慮する必要があります指定された一致が見つかりません)。あなたがリストに移動し、それらの値を更新したい場合は、次のように行うことができますを意味します

foreach(var objUserUsed in objEntity.UserOfferUseds.Where(TBL => TBL.UserID == UserID)) 
{ 
    objUserUsed.UsedCoupon = 0; 
} 
+0

あなたの迅速な対応をありがとうございました。しかし、私はどのようにobjUserUsedテーブルの列の値を更新できますか?私はテーブル内の新しい値よりも多くを更新する必要があるので..単一または最初.. –

+0

@KuldipRana:私は答えを –

+1

更新しました。この 'objUserUsed = objEntity.UserOfferUseds.Where(TBL => TBL.UserID == UserID).FirstOrDefault() ';私たちはこの 'objUserUsed = objEntity.UserOfferUseds.FirstOrDefault(TBL => TBL.UserID == UserID); ' – Eldho

1

LINQ文は、列挙されているシーケンスに作用します。これはあなたが言うことができることを意味します:私に最初のものを与えてください。そして:私はこれを持っている、私に次のものを与えてください。

ほとんどのlinq演算子は、IEnumerable < T>を返します。つまり、別のシーケンスを返します。 foreachのようなものを実行するまで、またはenqnumerable < T>を返さないlinq文を実行するまで、シーケンスは列挙されません。T

つまり、ステートメントがシーケンスを返す限り本当に列挙された。

SingleOrDefaultを検索すると、戻り値がTであることがわかります。戻り値を計算するには、シーケンスが列挙されます。

Enumerable.Whereの戻り値はTではなく、IEnumerable < T>です。コンパイラはこう言っています。

を使用すると、パラメータなしのSingleOrDefault必要がありますあなたの最初の文と同じ結果を取得するには、次の

IEnumerable<UserOfferUsed> mySequence = objEntity.UserOfferUseds 
    .Where(TBL => TBL.UserID == UserID); 
UserOfferUsed objUserUsed = mySequence.SingleOrDefault(); 

をそれとも、1つのステートメントでそれをしたい場合:

UserOfferUsed objUserUsed = objEntity.UserOfferUseds 
    .Where(TBL => TBL.UserID == UserID) 
    .SingleOrDefault(); 

あなたは見上げる場合First/Single/Any/All、シーケンスを返さないLinq関数、シーケンスの要素の1つのような関数は、パラメータとパラメータなしのバージョンを持つバージョンを見つけるでしょう。パラメータを持つ関数は、パラメータのない機能に続くパラメータでどこに使用するのと同じ効果があります。

var result = SomeSequence.Last(x => SomeFunction(x)) 

とシーケンスの同じ項目を返します。

var result = SomeSequence.Where(x => SomeFunction(x)).Last(); 
+0

を試してみてください。 –