Увы, вы забыли рассказать нам, что такое Process.Name
и LocalSequenceNumber
.Из идентификаторов кажется, что они не являются частью вашего Cars
, а являются значениями в вашем локальном процессе.Почему бы не вычислить Ключ перед вашим запросом?
var key = string.Format("{0}_{1}", Process.Name, LocalSequenceNumber);
db.Cars.SingleOrDefault(c => c.Id == id && c.Key == key);
Если, с другой стороны, Process.Name
или LocalSequenceNumber
являются Car
свойствами, вам придется изменить IQueryable.Expression
, то естьв вашем запросе LINQ, используя только те свойства и методы, которые могут быть переведены вашим IQueryable.Provider
в SQL.
К счастью, ваш Provider
знает ToSTring()
и концепцию конкатенации строк. Так что вы можете использовать это
Поскольку вы используете свойство Key
в Queryable.Where
, я предлагаю расширитьIQueryable
с функцией WhereKey
.Если функции расширения для вас немного волшебны, см. Демистифицированные методы расширения
public static IQueryable<Car> WhereKey(this IQueryable<Car> cars, int id, string key)
{
return cars.Where(car => car.Id == id
&& key == car.Process.Name.ToString() + "_" + car.LocalSequenceNumber.ToString());
}
Использование:
int carId = ...
string carKey = ...
var result = myDbContext.Cars
.WhereKey(carId, carKey)
.FirstOrDefault();
Рассмотрите возможность создания WhereKey
, который проверяет толькоключ.Объедините с Where
, который выбирает Id
.
var result = myDbContext.Cars
.Where(car => car.Id == id)
.WhereKey(carKey)
.FirstOrDefault();
Если Process.Name
или LocalSequenceNumber
не является частью Car, добавьте его в качестве параметра.Вы получаете суть.
Рассмотрите возможность создания WhereKey
, который проверяет только ключ.Объедините с Where
, который выбирает Id
.
При желании, вы можете создать WhereKeyFirstOrDefault()
, но я сомневаюсь, что это будет полезно.