Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “什么是”呢;它";实体框架内_C#_Linq_Entity Framework - Fatal编程技术网

C# “什么是”呢;它";实体框架内

C# “什么是”呢;它";实体框架内,c#,linq,entity-framework,C#,Linq,Entity Framework,如果以前有人问过这个问题,请原谅,但在我的任何搜索中都没有出现“它”。我有两个数据库表Person和Employee,为每种类型(例如Employee is-a-Person)建模一个表。在我的edmx designer中,我定义了一个单独的实体Employee,它将每一列映射到各自的基础表(例如名称->人员,薪资->员工) “它”允许我用LINQ表达式来做这样的事情: context.Employees.Where("it.Name LIKE 'M%' AND it.Salary > 1234

如果以前有人问过这个问题,请原谅,但在我的任何搜索中都没有出现“它”。我有两个数据库表Person和Employee,为每种类型(例如Employee is-a-Person)建模一个表。在我的edmx designer中,我定义了一个单独的实体Employee,它将每一列映射到各自的基础表(例如名称->人员,薪资->员工)

“它”允许我用LINQ表达式来做这样的事情:

context.Employees.Where("it.Name LIKE 'M%' AND it.Salary > 1234")
有没有什么好的链接可以解释“it”的行为方式?我认为这不是一个通用的LINQ,它在某种程度上特定于实体框架

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

public partial class TestObjectContext : ObjectContext
{
  // lots of boilerplate removed for clarity

  public ObjectSet<Employee> Employees
  {
    get
    {
      if ((_Employees == null))
      {
        _Employees = base.CreateObjectSet<Employee>("Employees");
      }
      return _Employees;
    }
  }
}
公共部分类TestObjectContext:ObjectContext
{
//为了清晰起见,删除了许多样板文件
公共对象集雇员
{
得到
{
如果(_Employees==null))
{
_Employees=base.CreateObjectSet(“Employees”);
}
返回(u)员工;;
}
}

}
您正在谈论的是
动态LINQ

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

<path to vs2008>\Samples\1033\CSharpSamples\LinqSamples\DynamicQuery\Dynamic Expressions.html
相当于

customers.Where("it.Country = @0", country);
IQueryable扩展方法都将其表达式参数解析为具有单个未命名参数的lambda表达式

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

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

Expression<Func<Customer, bool>> e1 = 
    DynamicExpression.ParseLambda<Customer, bool>("City = \"London\"");
Expression<Func<Customer, bool>> e2 =
    DynamicExpression.ParseLambda<Customer, bool>("Orders.Count >= 10");
IQueryable<Customer> query =
    db.Customers.Where("@0(it) and @1(it)", e1, e2);
表达式e1=
ParseLambda(“城市=”伦敦“);
表达e2=
DynamicExpression.ParseLambda(“Orders.Count>=10”);
可查询查询=
db.Customers.Where(“@0(it)和@1(it)”,e1,e2);
当然,可以以这种方式组合静态和动态lambda表达式:

Expression<Func<Customer, bool>> e1 =
    c => c.City == "London";
Expression<Func<Customer, bool>> e2 =
    DynamicExpression.ParseLambda<Customer, bool>("Orders.Count >= 10");
IQueryable<Customer> query =
    db.Customers.Where("@0(it) and @1(it)", e1, e2);
表达式e1=
c=>c.City==“伦敦”;
表达e2=
DynamicExpression.ParseLambda(“Orders.Count>=10”);
可查询查询=
db.Customers.Where(“@0(it)和@1(it)”,e1,e2);
上述两个示例具有与以下相同的效果:

IQueryable<Customer> query =
    db.Customers.Where(c => c.City == "London" && c.Orders.Count >= 10);
IQueryable查询=
db.Customers.Where(c=>c.City==“London”&c.Orders.Count>=10);

它是当前
ObjectQuery
命令的默认别名。请参阅查询生成器方法,特别是别名部分:

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

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

int cost = 10;
// Return Product objects with a standard cost
// above 10 dollars.
ObjectQuery<Product> productQuery =
    context.Products
           .Where("it.StandardCost > @cost", new ObjectParameter("cost", cost));
int成本=10;
//以标准成本返回产品对象
//10美元以上。
ObjectQuery产品查询=
背景.产品
。其中(“it.StandardCost>@cost”,新对象参数(“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<Product> filteredProduct = productQuery.OrderBy("product.ProductID");
//设置查询的Name属性,然后
//将该名称用作后续文档中的别名
//OrderBy方法。
productQuery.Name=“产品”;
ObjectQuery filteredProduct=productQuery.OrderBy(“product.ProductID”);

看起来它是指对象本身(在本例中是指员工)。这是从哪里得到的?提供一些上下文代码…即使在这个简单的例子中,生成SQL时“it”是两个不同的表。我想知道如果我向表达式中抛出一些联接(或包含),它是如何工作的。@Kris上下文对象是由EDMX设计器生成的默认对象(即,它是ObjectContext对象)。ObjectContext上的所有ObjectSet属性似乎都有这种有趣的“It”特性。不,这不是他所说的。我已经了解到“It”指的是当前实例(例如,处理IQueryable时的T实例)。动态表达式链接看起来有点深奥,我认为“It”可能更常见。@BrokenGlass包含了文档的摘录。希望它能澄清:)谢谢,@BrokenGlass。我确实注意到(在看到您的响应并使用我的代码之后),每次返回一个新的QueryObject时,名称都会恢复为“it”:它并不总是流向后续的方法。var objectQuery=context.Employees.Where(“类似于'M%'的it.Name”);objectQuery.Name=“e”;objectQuery=objectQuery.Where(“e.Salary<0”).Where(“it.JobTitle,如“D%”);
// Set the Name property for the query and then 
// use that name as the alias in the subsequent 
// OrderBy method.
productQuery.Name = "product";
ObjectQuery<Product> filteredProduct = productQuery.OrderBy("product.ProductID");