1

メソッドにパラメーターとして渡される手動で並べ替えられたリスト (Web フォーム) をLinq クエリで保存する Save メソッドがあり、データベースから取得したのOrder プロパティを更新しようとしています (EF )リスト内の対応する値を使用します(おそらく、以下のコードでより明確になるでしょう):IEnumerable<VM_CategoryLabel>

public static void SaveFromList(IList<VM_CategoryLabelExtra> listTemplate)
    {
        int idCat = listTemplate.Select(x => x.IdCat).FirstOrDefault();
        var test = (int)listTemplate.Where(z => z.Id == 8).Select(z => z.Order).FirstOrDefault();

        using (var context = new my_Entities())
        {
            var requete = from x in context.arc_CatLabel
                          where x.ID_Categorie == idCat
                          orderby x.Sequence_Cat
                          select new VM_CategoryLabel
                          {
                              Id = x.ID_LabelPerso,
                              //Order = x.Sequence_Cat,
                              Order = (int)listTemplate.Where(z => z.Id == x.ID_LabelPerso).Select(z => z.Order).First(),
                              Label = x.arc_Label.Label,
                              Unit = x.arc_Label.Unit
                          };
            context.SaveChanges();
        }
    }

「サブクエリ」が正しい値を取得するかどうかを確認するために「テスト」varを使用しましたが、実際にはそうなりますが、Select (コメント付きの Order 行) 内で Linq 式を使用すると、次のエラーが発生します。

タイプ「Namespace.Models.VM_CategoryLabelExtra」の定数値を作成できません。「このコンテキストでは、プリミティブ型と列挙型のみがサポートされています。

ここに私のクラスがあります:

       public class VM_CategoryLabel
{
    public int Id { get; set; }
    public int Order { get; set; }
    public string Label { get; set; }
    public string Unit { get; set; }
    public bool Checked { get; set; }
}

public class VM_CategoryLabelExtra
{
    public int Id { get; set; }
    public int IdCat { get; set; }      
    public int Order { get; set; }
    public string Label { get; set; }
    public string Unit { get; set; }
    public bool Checked { get; set; }
}

それで、クエリ内のリストをクエリするべきではないと思いますか?では、2 つの値のリストを「一致」させるにはどうすればよいでしょうか。

また、反復変数が読み取り専用であるため、次のことも試しました (Linq クエリで置換した後: Order = x.Sequence_Cat)。どちらも機能していません。

foreach (var item in requete)
                {
                    item.Order = listTemplate.Where(x => x.Id == item.Id).Select(x => x.Order).FirstOrDefault();
                }

                try
                {
                    context.SaveChanges();
4

2 に答える 2

2

これを使用することをお勧めします

let節です。

public static void SaveFromList(IList<VM_CategoryLabelExtra> listTemplate)
    {
        int idCat = listTemplate.Select(x => x.IdCat).FirstOrDefault();
        var test = (int)listTemplate.Where(z => z.Id == 8).Select(z => z.Order).FirstOrDefault();

    using (var context = new my_Entities())
    {
        var requete = from x in context.arc_CatLabel
                      where x.ID_Categorie == idCat
                      orderby x.Sequence_Cat
                      let list = listTemplate                                     
                      select new VM_CategoryLabel
                      {
                          Id = x.ID_LabelPerso,                              
                          Order = list.Where(z => z.Id == x.ID_LabelPerso).Select(z => z.Order).First(),                             
                          Label = x.arc_Label.Label,
                          Unit = x.arc_Label.Unit
                      };
        context.SaveChanges();
    }
}

編集:あなたができる代わりにfrom let list = listTemplate

今すぐ動作するはずです:)

于 2013-08-12T10:03:30.617 に答える
0

let の例:

// The let keyword in query expressions comes in useful with subqueries: it lets
// you re-use the subquery in the projection:

from c in Customers
let highValuePurchases = c.Purchases.Where (p => p.Price > 1000)
where highValuePurchases.Any()
select new
{
    c.Name,
    highValuePurchases
}

Let work の方法がわからない場合は、LinqPad をダウンロードして例を参照してください

于 2013-08-12T10:04:24.823 に答える