entity framework中的“它”是什么

请原谅我,如果以前曾经问过,但我的搜索中没有出现“它”。 我有两个数据库表Person和Employee建模一个Table-per-Type(例如Employee is-a Person)。 在我的edmx设计器中,我定义了一个单独的实体Employee,它将每个列映射到它们各自的基础表(例如Name – > Person,Salary – > Employee)。

“它”允许我在LINQ表达式中执行这样的操作:

context.Employees.Where("it.Name LIKE 'M%' AND it.Salary > 1234") 

是否有任何好的链接解释我如何期望“它”表现? 我认为它不是一般的LINQ事物,它对Entity Framework有点具体。

编辑0:生成的ObjectContext的C#代码如下:

 public partial class TestObjectContext : ObjectContext { // lots of boilerplate removed for clarity public ObjectSet Employees { get { if ((_Employees == null)) { _Employees = base.CreateObjectSet("Employees"); } return _Employees; } } } 

it是当前ObjectQuery命令的默认别名 。 请参阅Query Builder方法的文档 ,尤其是Alias部分:

按顺序应用查询构建器方法以构造累积查询命令。 这意味着当前的ObjectQuery命令被视为应用当前方法的子查询。

在查询构建器方法中,使用别名引用当前的ObjectQuery命令。 默认情况下,字符串“it”是表示当前命令的别名,如下例所示:

 int cost = 10; // Return Product objects with a standard cost // above 10 dollars. ObjectQuery productQuery = context.Products .Where("it.StandardCost > @cost", new ObjectParameter("cost", cost)); 

设置ObjectQuery的Name属性时,该值将成为后续方法中的别名。 以下示例通过将ObjectQuery的名称设置为“product”然后在随后的OrderBy方法中使用此别名来扩展前一个示例:

 // Set the Name property for the query and then // use that name as the alias in the subsequent // OrderBy method. productQuery.Name = "product"; ObjectQuery filteredProduct = productQuery.OrderBy("product.ProductID"); 

您正在谈论Dynamic LINQ库。

如果您安装了VS 2008,则可以在以下位置找到详细的API文档

 \Samples\1033\CSharpSamples\LinqSamples\DynamicQuery\Dynamic Expressions.html 

或者从这里下载

这是Scott Gu关于Dynamic LINQ的文章

以下是Dynamic Expressions.html文件的摘录。

当前实例

使用单个未命名参数解析lambda表达式时,未命名参数的成员将自动在表达式字符串的范围内,并且未命名参数给出的当前实例可以使用关键字整体引用。 例如,

 customers.Where("Country = @0", country); 

相当于

 customers.Where("it.Country = @0", country); 

IQueryable扩展方法都将它们的表达式参数解析为具有单个未命名参数的lambda表达式。

动态Lambda调用

表达式可以通过动态lambda调用引用其他动态lambda表达式。 动态lambda调用由一个替换变量标识符组成,该标识符引用System.Linq.Expressions.LambdaExpression的一个实例,后跟一个参数列表。 提供的参数必须与给定动态lambda表达式的参数列表兼容。

以下解析两个单独的动态lambda表达式,然后通过动态lambda调用将它们组合在谓词表达式中:

 Expression> e1 = DynamicExpression.ParseLambda("City = \"London\""); Expression> e2 = DynamicExpression.ParseLambda("Orders.Count >= 10"); IQueryable query = db.Customers.Where("@0(it) and @1(it)", e1, e2); 

当然可以以这种方式组合静态和动态lambda表达式:

 Expression> e1 = c => c.City == "London"; Expression> e2 = DynamicExpression.ParseLambda("Orders.Count >= 10"); IQueryable query = db.Customers.Where("@0(it) and @1(it)", e1, e2); 

以上示例都具有与以下相同的效果:

 IQueryable query = db.Customers.Where(c => c.City == "London" && c.Orders.Count >= 10);