Уви, забравихте да ни кажете какво са 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()
, но се съмнявам дали това ще бъде от голяма полза.
person
Harald Coppoolse
schedule
15.10.2018
NotMappedAttribute
, тогава свойството не може да бъде преведено в SQL израз. - person Tetsuya Yamamoto   schedule 15.10.2018Select
, за да го проектира в класа на модела. Прочетете подобен проблем тук: stackoverflow.com/questions/25867470/. - person Tetsuya Yamamoto   schedule 15.10.2018