Одна из проблем, с которой вы столкнулись, заключается в том, что ваш SSDL автоматически генерируется EntityModelGenerator, поэтому его редактирование будет стерто при перестроении.Ваши изменения должны быть сделаны в файле EDMX.
Итак, во-первых, вы должны решить, является ли (1) ваше возвращаемое значение вычислением сортировки (т.е. добавление значений вместе в приложении, а не на уровне базы данных)или (2) это прямой вызов хранимой процедуры базы данных?
(1) Первый шаг - добавить определение XML функции в ваш файл EDMX:
<Function Name="LineTotal" ReturnType="decimal">
<Parameter Name="lineTotal" Type="MyDbModel.OrderDetail">
<DefiningExpression>
od.Price * od.Quantity
</DefiningExpression>
</Parameter>
</Function>
Теперь,хотя ваш EDMX знает об этой функции, ваш IntelliSense не будет.Таким образом, вы должны добавить код, чтобы сделать эту работу.Рекомендуется размещать эти функции в отдельном классе.
public class ModelDefinedFunctions
{
[EdmFunction("MyDbModel" , "LineTotal")] //Model Name and Function Name
public static decimal LineTotal(OrderDetail od)
{
throw new NotSupportedException("LineTotal cannot be directly used.");
}
}
Entity Framework будет знать, что вместо этого следует перенаправить этот вызов функции в EDMX.Любой прямой вызов этого метода, где модель не существует, вызовет исключение.
Затем вы можете вызвать его в запросах LINQ, например
var productValues = from line in model.OrderDetails
select new
{
od.ProductID,
od.Price,
od.Quantity,
LineTotal = ModeDefinedFunctions.LineTotal(line)
};
(2) Если вы добавляетехранимой процедуры напрямую, ее проще перетащить в дизайнер EDMX.Существует атрибут [FunctionImport ()], но я его не использовал.Вы можете перетащить и посмотреть, какой код он генерирует в файле EDMX?
Кроме того, вы можете вызвать model.ExecuteCommand(<spname> , params object[] values
)
метод выполнения хранимой процедуры.