2013-03-12 94 views
3

我正在更新旧的应用程序,以使用EF和Linq。我无法与查询之一 - 在SQL是:ASP.Net MVC将Sql转换为Linq

SELECT id, type_id, rule_name, rule_start, rule_end, rule_min 
FROM  Rules 
WHERE  (rule_min > 0) 
      AND (rule_active = 1) 
      AND (rule_fri = 1) 
      AND ('2012-01-01' BETWEEN rule_start AND rule_end) 
      AND (id IN 
         (SELECT  rule_id 
         FROM  RulesApply 
         WHERE  (type_id = 3059))) 
ORDER BY pri 

到目前为止,我有:

  var rules = db.Rules.Include("RulesApply") 
       .Where(t => (t.rule_active == 1) 
        && (t.rule_min > 0) 
        && (dteFrom >= t.rule_start && dteFrom <= t.rule_end) 
        && (this is where I'm stuck) 
        ) 
        .OrderBy(r => r.pri); 

这是最后的子查询我卡与添加到LINQ以上:

AND (id IN 
(SELECT  rule_id 
FROM  RulesApply 
WHERE  (type_id = 3059))) 

型号有:

public class Rule 
{ 
    [Key] 
    public Int64 id { get; set; } 
    public Int64 hotel_id { get; set; } 
    public byte rule_active { get; set; } 
    public DateTime rule_start { get; set; } 
    public DateTime rule_end { get; set; } 
    public int rule_min { get; set; } 
    public int pri { get; set; } 
    public virtual ICollection<RuleApply> RulesApply { get; set; } 
} 

public class RuleApply 
{ 

    [Key, Column(Order = 0)] 
    public Int64 type_id { get; set; } 
    [Key, Column(Order = 1)] 
    public Int64 rule_id { get; set; } 
    [ForeignKey("rule_id")] 
    public virtual Rule Rule { get; set; } 
} 

任何人都可以请帮我完成这个查询吗?

谢谢

马克

+1

告诉我们您的模型 – jgauffin 2013-03-12 13:55:53

回答

2

试着这样做:

var rules = db.Rules.Include("RulesApply") 
       .Where(t => (t.rule_active == 1) 
        && (t.rule_min > 0) 
        && (dteFrom >= t.rule_start && dteFrom <= t.rule_end) 
        && t.RulesApply.Any(a => a.type_id == 3059) 
        .OrderBy(r => r.pri); 

如果t.RulesApply是非法的(即不编译),然后用正确的参考导航属性替换在您的Rules对象上发现,指向RulesApply对象。

+0

感谢 - intellisense for t.RulesApply。没有拿出任何属性,只是计数,订单,第一等等等等。你是指正确的参考导航属性是什么意思?数据库表是旧的,并且没有主键,因此将[键,列...]添加到可应用的规则中。再次感谢,马克 – Mark 2013-03-12 14:36:17

+0

编辑匹配。 – IronMan84 2013-03-12 14:55:04

2

如果你已经在实体之间建立的导航性能,你可以从一个导航到其他:

//This gets the RulesApply object 
var rulesapply = db.RulesApply.Single(x=> x.type_id == 3059); 

//This gets all Rules connected to the rulesapply object through its navigational property 
var rules = rulesapply.Rules; 

//You can use LINQ to further refine what you want 
rules = rules.Where(x=> /* and so on...*/); 

您可以在一行中堆叠在一起这些语句中,我只拆他们为可读性目的:)