Альтернативный метод ответа BenAlabaster
Прежде всего, вы можете переписать запрос следующим образом:
var matches = from Users in people
where Users.User_Rights == "Admin" ||
Users.User_Rights == "Users" ||
Users.User_Rights == "Limited"
select Users;
Конечно, это более «многословно» и больно писать но он работает все равно.
Итак, если бы у нас был какой-то метод утилиты, который упростил создание таких выражений LINQ, мы бы были в бизнесе.
с помощью метода утилиты на месте вы можете написать что-то вроде этого:
var matches = ctx.People.Where(
BuildOrExpression(
p => p.User_Rights, names
)
);
Это создает выражение, которое имеет такой же эффект, как:
var matches = from p in ctx.People
where names.Contains(p.User_Rights)
select p;
Но что более важно, фактически работает с .NET 3.5 SP1.
Вот функция сантехники, которая делает это возможным:
public static Expression> BuildOrExpression(
Expression> valueSelector,
IEnumerable values
)
{
if (null == valueSelector)
throw new ArgumentNullException("valueSelector");
if (null == values)
throw new ArgumentNullException("values");
ParameterExpression p = valueSelector.Parameters.Single();
if (!values.Any())
return e => false;
var equals = values.Select(value =>
(Expression)Expression.Equal(
valueSelector.Body,
Expression.Constant(
value,
typeof(TValue)
)
)
);
var body = equals.Aggregate(
(accumulate, equal) => Expression.Or(accumulate, equal)
);
return Expression.Lambda>(body, p);
}
Я не собираюсь пытаться объяснить этот метод, кроме как сказать, что он по существу строит предикат выражение для всех значений с помощью значенияSelector (т.е. p => p.User_Rights) и ORs, которые предикаты вместе создают выражение для полного предиката
Вы можете дать заполнителям любые имена, которые вы хотите, чтобы что-то вроде этого для вашего SQL:
INSERT INTO propAmenities
(amenity_id, property_id)
VALUES
(:amenity_id1, :property_id1),
(:amenity_id2, :property_id2),
(:amenity_id3, :property_id3)
И затем:
$stmt->bindParam(':amenity_id1', 1);
$stmt->bindParam(':property_id1', 1);
$stmt->bindParam(':amenity_id2', 2);
$stmt->bindParam(':property_id2', 1);
$stmt->bindParam(':amenity_id3', 3);
$stmt->bindParam(':property_id3', 1);
Или, конечно, создать подходящий массив для execute
. В этом случае нельзя использовать неименованные заполнители:
INSERT INTO propAmenities
(amenity_id, property_id)
VALUES
(?, ?),
(?, ?),
(?, ?)
И затем вы можете прокручивать свои значения и вызывать execute
с соответствующим массивом:
$stmt->execute(array(1, 1, 2, 1, 3, 1));
Гораздо проще не использовать подготовленный запрос здесь, просто сгенерируйте строку запроса, используя некоторый файл implode () s и выполните его. Конечно, убедитесь, что ваши параметры правильно процитированы (так как они int, с применением intval () достаточно).