【问题标题】:LinQ to SQL and where is the choice for all databaseLinQ to SQL 以及所有数据库的选择在哪里
【发布时间】:2017-04-24 02:51:18
【问题描述】:

我有这样的源代码:

var res = from s in Splitting 
          join c in Customer on s.CustomerId equals c.Id
         where c.Id == customrId
            && c.CompanyId == companyId
        select s;

在查看代码时,一位成员说我的代码只适用于一个 SQL db,并建议我使用 LinQ to Entity with Join,以便它适用于所有数据库。

我不明白,我想,即使使用其他数据库,我们也会将其添加到实体框架中。下面的代码也可以正常工作,对吧?

请指教。

【问题讨论】:

  • 此查询是否在内存中运行?您的同事是否在谈论将 SplittingCustomer 替换为 queryContext.Splitting/queryContext.Customer
  • 他们的意思是,通过使用上面的查询,当我们将 db 更改为 Oracle、mySQL 等其他人时,它不会被使用...

标签: linq entity-framework-6


【解决方案1】:

您可以通过两种方式编写 LINQ

1.LINQ Query Expressions (query-syntax)(你已经完成了)

var res = from s in Splitting 
          join c in Customer on s.CustomerId equals c.Id
         where c.Id == customrId
            && c.CompanyId == companyId
        select s;

2.另一个是LINQ query extension methods (dot-syntax)

var res = Splitting.Join(Customer,
                 sp => sp.CustomerId,
                 cu => cu.Id,
                 (sp, cu) => new { sp, cu })
           .Where(s => s.cu.Id == customrId && s.cu.CompanyId == companId)
           .Select(s => s.sp);

对于连接,我更喜欢 query-syntax。有一些细节可以说明 query-syntax 隐藏了它带来的可读性改进,使其非常值得拥抱。但是 query-syntax 有点 在其他方面比 dot-syntax 更受限制。

dot-syntax 更简洁,但执行多个表连接是一场噩梦。另一方面是有许多 LINQ 仅存在于 dot-syntax 中的操作:Single(), First()、Count() 等。对于查询语法的这些限制,您可以使用 点语法。

注意:在编译时,所有都转换为标准查询。

【讨论】:

  • hi Ashiquzzaman,使用 LinQ 点语法,如果我们想从 SQL db 更改为 Oracle db,它也可以正常工作,对吧?
  • 嗨 Ashiquzzaman,那是因为我们正在处理实体 (.edmx) 对吗?实际执行时,实体框架会根据哪个数据库解析它以正确选择?很抱歉给您带来不便,我只是问,因为我想知道 EF 是如何工作的。谢谢。
  • 对不起,我听不懂你在问什么。
  • 谢谢,我的问题是,对于上面的示例,当通过 SQL Profiler 检查时,我们会看到 SQL 将转换为 SQL 语法,对吗? Oracle 也一样,Oracle 也会转成 Oracle 语法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2018-03-11
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多