c# - LINQ vs context.entity.Where()

标签 c# linq entity-framework

这两个块是否完全相同?一个相对于另一个有什么优势吗?

        using (var context = new TRANSITEntities())
        {
            var result = context.Table1.Where(c => c.UserCode == "123");
        }


        using (var context = new TRANSITEntities())
        {
            var result = from c in context.Table1
                         where c.UserCode == "123"
                         select c;
        }

最佳答案

一模一样。

您可以通过查看ToString()来验证自己

    string query1String, query2String;
    using (var context = new TRANSITEntities())
    {
        var result = context.Table1.Where(c => c.UserCode == "123");
        query1String = result.Expression.ToString();
    }


    using (var context = new TRANSITEntities())
    {
        var result = from c in context.Table1
                     where c.UserCode == "123"
                     select c;
        var query2String = result.Expression.ToString();
    }

    Assert.AreEqual(query1String, query2String);


还应注意,result实际上不是结果。这是未执行/枚举的IQueryable。这意味着它就像尚未运行(某种)的SQL语句。如果你要做

    var t1 = result.ToArray()
    var t2 = result.ToArray()


那么查询实际上将执行两次。 t1t2是REAL结果(在内存数组中)...不是result。换句话说,result应该真正被命名为query并且,上面的示例将永远无法工作...因为如果在ToArray块之外的结果上调用using,它将失败。 ..因为一旦上下文被处理,您将无法运行查询:

    using (var context = new TRANSITEntities())
    {
        var result = context.Table1.Where(c => c.UserCode == "123");
    }
    // throws exception:
    var array = result.ToArray();

关于c# - LINQ vs context.entity.Where(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7110704/

相关文章:

c# - 使用面板创建动态网格

c# - 如何在不知道其属性名称和类型的情况下过滤 Blazor 组件中的通用列表参数

c# - 如何使 DataGrid 看起来像 CardView?

c# - 根据日期对列表进行分组,每个项目有多个日期

c# - 使用 Entity Framework 4 使用 Web Api 返回复杂对象

c# - Xamarin.Forms 中编辑器的边框颜色

c# - 本地序列不能用于查询运算符的 LINQ to SQL 实现,但 Contains() 运算符除外

c# - 从 List<T> 中选择与无法直接在属性上指定的条件相匹配的组

c# - EF 查询只读 Iqueryable

sql-server - 有没有一种方法可以仅覆盖 Entity Framework 中的删除存储过程