簡體   English   中英

如何強制 SQL 參數而不是表達式謂詞中的常量

[英]How to force SQL parameter instead of constant in Expression predicate

我想創建謂詞表達式,以便將其轉換為帶有 SQL 參數的 WHERE 子句,例如:

WHERE e.Id = @id_1;

我有這個代碼

int id = 1;
Expression<Func<Entity, int>> keySelector = e => e.Id;
BinaryExpression equals = Expression.Equal(
   keySelector.Body, 
   Expression.Constant(id, keySelector.Body.Type)); //replace this with a variable

var predicate = Expression.Lambda<Func<Entity, bool>>(equals, keySelector.Parameters[0]);

但它轉化為:

WHERE e.Id = 1;

它為每個 id 生成新的查詢執行計划。

EF 核心是否提供一些我可以(應該)使用的內部機制,例如 Expression 的特殊子類或 ExpressionVisitor?

EF 核心是否提供一些我可以(應該)使用的內部機制,例如 Expression 的特殊子類或 ExpressionVisitor?

沒什么特別的。 您只需要模擬 C# 閉包即可。 這可以通過多種方式完成——使用匿名類型、具體類型、 Tuple甚至真正的 C# 編譯器生成的閉包,例如

int id = 1;
Expression<Func<int>> valueSelector = () => id;
var value = valueSelector.Body; // use this in place of Expression.Constant

匿名類型方法的示例

int id = 1;
var variable = new { id };
var value = Expression.Property(Expression.Constant(variable), nameof(id));

new Tuple<int>(id)Item1類似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM