2013-03-12 92 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...*/); 

您可以在一行中堆疊在一起這些語句中,我只拆他們爲可讀性目的:)