Новичок: как наиболее эффективно собирать данные из нескольких таблиц?

#c# #.net #linq #visual-studio-2010 #ado.net

#c# #.net #linq #visual-studio-2010 #ado.net

Вопрос:

Мне интересно, как я мог бы наиболее эффективно собирать данные из нескольких таблиц с помощью C #. Я не очень привык к C # и управлению базами данных: Я слышал о ADO.NET и LINQ, и простота работы с таблицами, но у меня пока не было времени прочитать об этом.

Итак, мой подход к сбору данных сильно усложнен:

         int id = 43;
        var collectedData = new System.Collections.Generic.Dictionary<string, string>(); // this will later be all my collected data

        // Load from first table
        string select1 = "SELECT * FROM table1 WHERE ID = "   id;
        DataRow dataRow1= SqlHelper.Execute.SingleRow(select1); // my helperclass returning one single data row of a table
        collectedData["Surname"] = dataRow1["Surname"];
        collectedData["Name"] = dataRow1["Name"];
        collectedData["Age"] = dataRow1["Age"];

        // Load from second table
        string select2 = "SELECT * FROM table2 WHERE ID = "   id;
        DataRow dataRow2= SqlHelper.Execute.SingleRow(select2); 
        collectedData["Mother"] = dataRow2["Mother"];
        collectedData["Father"] = dataRow2["Father"];
        collectedData["Job"] = dataRow2["Job"];

        // ...
  

Итак, как бы вы, профессионалы C # и .NET, решили это? Я с нетерпением жду ваших примеров кода!

Комментарии:

1. Вы сами дали ответ. С ADO.net и linq. Вам действительно следует сначала прочитать материал, это очень простой вопрос. Здесь у вас есть ссылка на linq

Ответ №1:

Если вы работаете с SQL Server, ADO.NET LINQ-to-SQL — это определенно правильный путь.

Причины LINQ:

  1. Это естественно подходит для вашего.СЕТЕВОЙ код, IDE и отладчик
  2. Вам не нужно хранить свой код в одном месте, а запросы — в другом
  3. Вы не программируете SQL-запросы жестко, и вам не нужно беспокоиться о создании параметризованного SQL (что, на мой взгляд, действительно сложно)
  4. Он очень быстрый в написании и удивительно гибкий
  5. Ваш код будет чище и меньше, потому что вам не нужно иметь ADO.NET и подключение к базе данных повсюду — LINQ заботится обо всех сложных вещах
  6. Вы получаете хороший конструктор сущностей, который позволяет перетаскивать данные из SQL-соединения

Причины не использовать LINQ:

  1. Если вам нужно выжать из запроса все до последней капли производительности, LINQ может оказаться не самым естественным выбором, потому что SQL иногда может быть более гибким. Но вам действительно следует внимательно рассмотреть свой запрос, чтобы увидеть, есть ли более простой способ сделать это.
  2. Некоторым местам не нравятся последствия для безопасности, потому что таблицы должны быть общедоступными для подключенного пользователя. Некоторые компании разрешают доступ к таблицам только через SPROCS.

Для вашего примера вы захотите создать классы (POCO), которые представляют объекты вашей базы данных. Затем вы будете использовать LINQ для запроса ваших таблиц и загрузки данных в новые объекты entity. Я предпочитаю иметь конструктор в объектах моего домена / сущности, который преобразует постоянные объекты базы данных, сгенерированные LINQ, в объекты уровня домена, которые будут использоваться клиентом.

 public class Person
{
    public int ID { get; set; }
    public string Surname { get; set; }
    public string Name { get; set; }
    public short Age { get; set; }

    public Person()
    {
    }

    public Person( Persistence.Person src )
    {
      this.ID = src.ID;
      this.Surname = src.surname;
      this.Name = src.name;
      this.Age = src.age;
    }
}

...
public List<Domain.Person> LoadPeople()
{
    using( var context = this.CreateContext() )
    {
        var personQuery = from p in context.Persons
                          select new Domain.Person( p );

        return personQuery.ToList();
    }
}

public Person LoadPerson( int personID )
{
    using( var context = this.CreateContext() )
    {
        var personQuery = from p in context.Persons
                          where p.id == personID
                          select new Domain.Person( p );

        return personQuery.SingleOrDefault();
    }
}
  

Ответ №2:

Предполагая, что у вас есть следующие таблицы:

 tblUsers
UserID LName FName GenderID
1      Joe   Chan  1
2      Koh   Wang  2
3      John  Chen  1


tblGenders
GenderID Gender
1        Male
2        Female
  

Вы можете использовать этот код для получения набора данных, который будет содержать объединенную информацию из двух таблиц выше.

         SqlConnection con = new SqlConnection(Connection String for you database);
        con.Open();
        SqlCommand comm = con.CreateCommand();
        comm.CommandText = "SELECT u.UserID, u.Fname, u.Lname, u.GenderID, g.Gender 
                            FROM tblUsers u, tblGenders g 
                            WHERE u.GenderID = g.GenderID";
        SqlDataAdapter da = new SqlDataAdapter(comm);
        DataSet ds = new DataSet();
        da.Fill(ds);
  

вы можете получить доступ к строкам под таблицей, используя этот код
da.Table[0].Строки;

если вы уже знакомы с хранимыми процедурами, вы также можете использовать этот код:

     internal static List<RoomType> FetchRoomTypeList()
    {
        List<RoomType> roomTypes = new List<RoomType>();
        SqlCommand commRoomTypeSelector = ConnectionManager.MainConnection.CreateCommand();
        commRoomTypeSelector.CommandType = CommandType.StoredProcedure;
        commRoomTypeSelector.CommandText = "Rooms.asp_RMS_RoomTypeList_Select";
        SqlDataAdapter da = new SqlDataAdapter(commRoomTypeSelector);
        DataSet ds = new DataSet();
        da.Fill(ds);
        roomTypes = (from rt in ds.Tables[0].AsEnumerable()
                     select new RoomType
                     {
                         RoomTypeID = rt.Field<int>("RoomTypeID"),
                         RoomTypeName = rt.Field<string>("RoomType"),
                         LastEditDate = rt.Field<DateTime>("LastEditDate"),
                         LastEditUser = rt.Field<string>("LastEditUser"),
                         IsActive = (rt.Field<string>("IsActive") == "Active")
                     }
                    ).ToList();

        return roomTypes;
    }
  

для получения дополнительной информации посетите:

http://www.homeandlearn.co.uk/csharp/csharp.html