更新此数据的最佳方法是什么?

时间:2018-01-25 18:33:34

标签: c# sql-server entity-framework linq

我有一个项目列表,它们在一个表上有自己独立的行,并且它有一个映射到另一个表的Id。这一次抓住每个项目。

        List<Item> itemsFromRepo = new List<Item>();

        foreach (var item in items)
        {
            itemsFromRepo.Add(_itemRepository.Get(item.ItemId));
        }

是否有更好的方法来查询数据库中的这些项目,而不是一次一个?

3 个答案:

答案 0 :(得分:1)

你的问题有点令人困惑,所以我要回顾一下你对问题的理解,然后根据这种理解回答一个可能的解决方案。我对您的问题的理解是,您有一个已枚举的项目列表,并且您希望根据枚举列表中的ID属性获取结果。看起来您想要从存储库中获取结果。要考虑的一个问题是,您是为了从第二个表中获取结果而列举列表还是需要两个表中的结果?如果您只需要查询中最后一个表的结果,我们可以提高效率,但我认为您现在需要两者。这是我如何在没有foreach循环的情况下获得您尝试获取的数据:

1抓住您需要的标准。

 var ids = items.Select(x => x.ItemId).Distinct().ToList();

2构建一个存储库方法,通过ID列表获取数据。

//Assuming you're using Ints as your ID here, just sub in whatever ID you're using
            public static List<Item> GetByIDs(List<Int32> ids)
           {
               using(var dbContext = new YourDBContextHere())
               {
                 return dbContext.Items.Where(x => ids.Contains(x.ItemId)).ToList();
               }
           }

另一件需要考虑的事情,取决于您正在做什么,您可以批量拨打电话,使他们的速度明显加快(您可以获得&#39;物品&#39;以及您的物品从&#39;&#39; itemsFromRepo&#39 ;同时保存数据库调用)。

答案 1 :(得分:-1)

您可以选择阵列所需的所有数据并在服务器端使用它,它会更快

答案 2 :(得分:-2)

将您的数据放入数据表并发送该数据表

示例

public DataTable CreateTable()
        {
            var dt = new DataTable();
            dt.Columns.Add("Label", typeof(string));
            dt.Columns.Add("Value", typeof(string));
            return dt;
        } 
public postdata(formdata){
var myDataTable = CreateTable();
            foreach (var dataField in formData.PostedFields)
            {
                myDataTable.Rows.Add(dataField.Label, dataField.Value);
            }

 using (var cnn = new SqlConnection(connectionString))
            {
                var cmd = cnn.CreateCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "WebFormTask";
               SqlParameter param = cmd.Parameters.AddWithValue("@PostedFields", myDataTable);
                               cnn.Open();
                cmd.ExecuteNonQuery();
                cnn.Close();
            }
}

根据该程序创建存储过程。