Можно сделать это (хотя не молния быстро) как так:
people.Where(p => !people.Any(q => (p != q && p.Id == q.Id)));
таким образом, "выбирают все люди, где нет другого другого человека в списке с тем же идентификатором".
, Обратите внимание, в Вашем примере, который просто выбрал бы человека 3. Я не уверен, как сказать, который Вы хотите из предыдущих двух.
Что-то вроде:
using System.Data;
using System.Data.SqlClient;
using(SqlConnection connection = new SqlConnection("")){
SqlCommand command = new SqlCommand(@"
insert into
tblFoo (
col1,
col2
) values (
@val1,
@val2
)",
connection
);
SqlParameter param = new SqlParameter("@val1", SqlDbType.NVarChar);
param.Value = "hello";
command.Parameters.Add(param);
param = new SqlParameter("@val2", SqlDbType.NVarChar);
param.Value = "there";
command.Parameters.Add(param);
command.ExecuteNonQuery();
connection.Close();
}
- Изменить:
Хотя, конечно, когда вы начинаете делать серьезные дела, Я рекомендую ORM. Я использую LLBLGen (это стоит денег, но определенно того стоит).
- Edit:
SqlConnection
То, через что вы общаетесь с базой данных. Это будет содержать имя сервер, имя пользователя, пароль и другие прочие вещи.
SqlCommand
Что-то, что содержит оператор sql, который вы хотите отправить на сервер. Это может быть «обновление», «вставка», «выбор» или что-то еще. В зависимости от того, что это такое, вы используете другой метод для его выполнения, чтобы получить данные обратно.
SqlDataAdapter
Странный метод; он используется специально для заполнения DataSet. По сути, он выполняет небольшую работу за вас, добавляя найденную информацию в набор.
DataSet
Не уверен, насколько просто вы этого хотите. Это просто набор возвращенных данных в табличном формате, который вы можете перебирать. Он содержит DataTables, потому что некоторые запросы могут возвращать более одной таблицы. Однако, как правило, у вас есть только одна таблица, и вы можете к ней привязаться или что-то еще.
Создайте соединение sql, откройте его, создайте команду sql, выполните ее, чтобы получить sqldatareader, вуаля. Для простого примера адаптер данных вам не понадобится.
string connectionString = "...";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
string sql = "select field from mytable";
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine(rdr[0]);
}
}
В ADO.NET есть учебное пособие, охватывающее многие вещи, которые вы ищете, на http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson01 .aspx . Урок 1 в основном является базовым, но урок 2 и далее посвящен объектам клиента SQL.
Другой учебник на http://www.codeproject.com/KB/database/sql_in_csharp.aspx охватывает некоторые основы (SqlConnection, SqlCommand).
Что ж, есть два способа взаимодействия с базой данных SQL Server на C #. Первый связан с LINQ, а второй - с библиотекой SqlClient.
Начиная с .NET 3.0, у нас был доступ к LINQ, который представляет собой довольно впечатляющую ORM и способ работы с коллекциями и списками. . LINQ может работать с базой данных двумя разными способами. Это:
У Скотта Гу есть неплохое руководство по LINQ to SQL . Я бы порекомендовал LINQ to SQL только для начала, и вы можете много использовать его в LINQ to Entities в будущем.
Пример select
для захвата всех клиентов в Нью-Йорке будет:
var Custs = from c in Customers
where c.State = 'NY'
select c;
foreach(var Cust in Custs)
{
Console.WriteLine(Cust.Name);
}
Традиционный способ C # доступа к базе данных SQL Server (до .NET 3.0) заключался в использовании библиотеки SqlClient . По сути, вы создаете SqlConnection , чтобы открыть соединение с базой данных. Если вам нужна помощь со строками подключения, посетите ConnectionStrings.com .
После подключения к базе данных вы будете использовать объект SqlCommand
для взаимодействия с ней. Наиболее важным свойством этого объекта является CommandText
. Он принимает SQL в качестве языка и запускает необработанные операторы SQL для базы данных.
Если вы выполняете вставку / обновление / удаление, вы будете использовать метод ExecuteNonQuery
из SqlCommand
. Однако, если вы делаете выбор, вы будете использовать ExecuteReader
и вернуть SqlDataReader
. Затем вы можете выполнить итерацию через SqlDataReader, чтобы получить свои результаты.
Ниже приведен код для захвата всех клиентов в Нью-Йорке, снова:
using System.Data;
using System.Data.SqlClient;
//...
SqlConnection dbConn = new
SqlConnection("Data Source=localhost;Initial Catalog=MyDB;Integrated Security=SSPI");
SqlCommand dbComm = new SqlCommand();
SqlDataReader dbRead;
dbConn.Open();
dbComm.Connection = dbConn;
dbComm.CommandText = "select name from customers where state = @state";
dbComm.Parameters.Add("@state", System.Data.SqlDbType.VarChar);
dbComm.Parameters["@state"].Value = "NY";
dbRead = dbComm.ExecuteReader();
if(dbRead.HasRows)
{
while(dbRead.Read())
{
Console.WriteLine(dbRead[0].ToString());
}
}
dbRead.Close();
dbConn.Close();
Надеюсь, это дает вам хорошее представление о том, что делает каждый подход, и как узнать больше .
при выполнении вставки / обновления / удаления вы будете использовать метод ExecuteNonQuery
из SqlCommand
. Однако, если вы делаете выбор, вы будете использовать ExecuteReader
и вернуть SqlDataReader
. Затем вы можете выполнить итерацию через SqlDataReader, чтобы получить свои результаты.
Ниже приведен код для захвата всех клиентов в Нью-Йорке, снова:
using System.Data;
using System.Data.SqlClient;
//...
SqlConnection dbConn = new
SqlConnection("Data Source=localhost;Initial Catalog=MyDB;Integrated Security=SSPI");
SqlCommand dbComm = new SqlCommand();
SqlDataReader dbRead;
dbConn.Open();
dbComm.Connection = dbConn;
dbComm.CommandText = "select name from customers where state = @state";
dbComm.Parameters.Add("@state", System.Data.SqlDbType.VarChar);
dbComm.Parameters["@state"].Value = "NY";
dbRead = dbComm.ExecuteReader();
if(dbRead.HasRows)
{
while(dbRead.Read())
{
Console.WriteLine(dbRead[0].ToString());
}
}
dbRead.Close();
dbConn.Close();
Надеюсь, это дает вам хорошее введение в то, что делает каждый подход, и как узнать больше .
при выполнении вставки / обновления / удаления вы будете использовать метод ExecuteNonQuery
из SqlCommand
. Однако, если вы делаете выбор, вы будете использовать ExecuteReader
и вернуть SqlDataReader
. Затем вы можете выполнить итерацию через SqlDataReader, чтобы получить свои результаты.
Ниже приведен код для захвата всех клиентов в Нью-Йорке, снова:
using System.Data;
using System.Data.SqlClient;
//...
SqlConnection dbConn = new
SqlConnection("Data Source=localhost;Initial Catalog=MyDB;Integrated Security=SSPI");
SqlCommand dbComm = new SqlCommand();
SqlDataReader dbRead;
dbConn.Open();
dbComm.Connection = dbConn;
dbComm.CommandText = "select name from customers where state = @state";
dbComm.Parameters.Add("@state", System.Data.SqlDbType.VarChar);
dbComm.Parameters["@state"].Value = "NY";
dbRead = dbComm.ExecuteReader();
if(dbRead.HasRows)
{
while(dbRead.Read())
{
Console.WriteLine(dbRead[0].ToString());
}
}
dbRead.Close();
dbConn.Close();
Надеюсь, это дает вам хорошее введение в то, что делает каждый подход, и как узнать больше .
В общем, я рекомендую использовать Microsoft Enterprise Library для доступа к БД. Я использовал его в нескольких проектах, и мне он очень нравится.
См. Краткое руководство по доступу к данным , предоставленное Microsoft, которое должно помочь вам начать работу
Кроме того, я также привык писать Extension Methods для извлечения данных из DataRows. Например, я могу сделать что-то вроде этого:
//Create an extension method, Value,
//to extract a certain type from a DataRow,
//supplying a default value to be used if DbNull.Value is encountered
DateTime someDateValue = dr["SomeDatabaseField"].Value(new DateTime());
Надеюсь, это поможет!
Примеры охватывают
SqlClient
using System;
using System.Data;
using System.Data.SqlClient;
class Sample
{
public static void Main()
{
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");
SqlCommand catCMD = nwindConn.CreateCommand();
catCMD.CommandText = "SELECT CategoryID, CategoryName FROM Categories";
nwindConn.Open();
SqlDataReader myReader = catCMD.ExecuteReader();
while (myReader.Read())
{
Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1));
}
myReader.Close();
nwindConn.Close();
}
}
OleDb
using System;
using System.Data;
using System.Data.OleDb;
class Sample
{
public static void Main()
{
OleDbConnection nwindConn = new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");
OleDbCommand catCMD = nwindConn.CreateCommand();
catCMD.CommandText = "SELECT CategoryID, CategoryName FROM Categories";
nwindConn.Open();
OleDbDataReader myReader = catCMD.ExecuteReader();
while (myReader.Read())
{
Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1));
}
myReader.Close();
nwindConn.Close();
}
}
Odbc
using System;
using System.Data;
using System.Data.Odbc;
class Sample
{
public static void Main()
{
OdbcConnection nwindConn = new OdbcConnection("Driver={SQL Server};Server=localhost;" +
"Trusted_Connection=yes;Database=northwind");
OdbcCommand catCMD = new OdbcCommand("SELECT CategoryID, CategoryName FROM Categories", nwindConn);
nwindConn.Open();
OdbcDataReader myReader = catCMD.ExecuteReader();
while (myReader.Read())
{
Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1));
}
myReader.Close();
nwindConn.Close();
}
}