2013-10-04 22 views
3

我正在从一个以SQL为中心的世界(我相当流利)到EF dDbContect,代码在先,我挣扎着。以下是一个简化的例子;我想写下面简单的SQL查询(花费60秒写入):从SQL转移到实体框架代码第一

SELECT 
    HP.HospitalID 
FROM 
    Hospitals AS HP 
    JOIN NHSTrusts AS NT 
    ON NT.NHSTrustID = HP.NHSTrust_NHSTrustID 

WHERE 
    HP.HospitalName + ', ' + NT.NHSTrustName = 'My hospital name including trust' 

作为EF样式查询。我看不到如何做到这一点,并且我不想每次看不到如何做时都回到SQL中。

谁能帮助:

  • 关于如何框上面的查询中EF dbContent
  • 在帮助普源与
+0

如何'Hospitals'和'NHSTrusts'表有关系吗? – Dennis

+0

请注意WHERE HP.HospitalName ='医院名称'和NT.NHSTrustName ='trust''可能会更有效率。您的方法不包括索引的使用 – GolfWolf

+0

每个信托都是作为医院的集合。医院只能属于一个信托。外键是'HP.NHSTrust_NHSTrustID' –

回答

3

假设这些实体类型:

public class Trust 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Hospital> Hospitals { get; set; } 
} 

public class Hospital 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int TrustId { get; set; } 
    public Trust Trust { get; set; } 
} 

你有这个疑问:

dbContext 
    .Hospitals 
    .Where(h => h.Name + h.Trust.Name == "My hospital name including trust") 
    .Select(h => h.Id); 
+0

嗨丹尼斯,非常感谢。补充问题;任何LINQ查询也可以使用lamda表达式来编写。 –

+0

@PeterSmith:这两种方式被称为“查询语法”和“方法语法”(我的例子)。你可以从这里开始:http://msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx。在大多数情况下,他们之间的选择是个人喜好的问题。 – Dennis

1

首先尝试一些LINQ的。你可以写下如下。查询可能有一些错误,它将由Intellisense纠正。

var s = (from c in Context.Hospitals 
      from h in Context.NHSTrusts 
      where c.NHSTrust_NHSTrustID==h.NHSTrustID 
      && string.Format("{0},{1}",c.HospitalName,h.NHSTrustName).Equals("My hospital name including trust") 

      select c.HospitalId).FirstOrDefault(); 
+0

如果您使用了联合声明而不是2来自您,您将会收到我的投票:) – Kristof

+1

嗨Amit,太棒了。我正在使用lamda表达式。我真的需要阅读LINQ。 –

+1

如果OP的实体应该与外键关联有关,那么对两个'from'语句(甚至'join)的需要是什么? – Dennis

1

一个好地方得到一些例子,我会建议101 linq samples
它拥有一切,从使用WHERE到GROUP BY语句。

4

假设你的实体和DB语境的设置是否正确,这里是你的查询可能看起来怎么样:

var hospitalIds = 
    from hp in dbContext.Hospitals 
    where 
     hp.HospitalName == "..." && 
     hp.Trust.NHSTrustName == "..." 
    select hp.HospitalId; 

当然,这个查询将要通过的结果迭代(或物化使用.ToList()/.ToArray())。

要正确定义实体和上下文,请参考MSDN上的这个优秀教程:http://msdn.microsoft.com/en-us/data/jj193542

+1

我完全支持这个!如果您的关系设置正确,您可以利用这些关系属性创建一个非常易读的查询。 – Kristof