将SQL转换为LINQ

时间:2014-10-09 17:13:19

标签: c# sql linq entity-framework

我需要帮助将一些SQL select转换为LINQ

这是原始的SQL:

Select Top 1 IsNull(ct.Template, t.Template) as Template 
From Template t
Left Outer Join ClientTemplate ct On t.TemplateTypeId = ct.TemplateTypeId And ct.ClientId = 149
Where t.TemplateTypeId = (Select TemplateTypeId From QuoteType Where QuoteTypeId = 7)
Order By t.Version DESC, ct.Version DESC

我正在使用Entity Framework并拥有QuoteTypes,ClientTemplates和Templates的实体。

上面的SQL从客户端149的ClientTemplate表中获取模板(在实际代码中使用一个变量)用于特定的QuoteType。如果CLientTemplate表中没有条目,那么它将从主模板表中返回相同QuoteType的模板!

我的想法是首先查询QuoteType,然后查询ClientTemplate表以查看是否存在,如果不是,则查询Template表。问题是这会产生三个查询,但我确信它可以一举完成!?

任何人都可以为我编写LINQ吗?

到目前为止,这是我的烂摊子:

QuoteType quoteType = (from qt in this.entities.QuoteTypes where qt.QuoteTypeID == this.SelectedNewQuoteTypeID select qt).First();
if (quoteType != null && quoteType.TemplateTypeID.HasValue)
{
    int quoteTypeTemplateTypeID = (int)quoteType.TemplateTypeID;

    var query = (from t in this.entities.Templates
             join ct in this.entities.ClientTemplates on t.TemplateTypeID equals ct.TemplateTypeID 
             into a
             from b in a.DefaultIfEmpty(new ClientTemplate())
             where t.TemplateTypeID == quoteTypeTemplateTypeID
             orderby t.Version descending
             select new
             {
                T1 = t.Template1,
                T2 = b.Template
             }).First();

    // Check the query to see if T1 and T2 are null and use whichever one isn't!
    // TODO !!!
}
else
{
    return string.Empty;
}

一旦我走到那一步,我有点放弃并发布了这个!我的示例仍然执行两个查询,并且不根据客户端ID进行选择。它在客户端模板表中也没有第二个订单。

我已经继承了原始的SQL语句,所以可能问题在于首先写得不好!?

告诉你......

2 个答案:

答案 0 :(得分:1)

我还没有测试过,但也许你可以试试这样的事情

from t in this.entities.Template
from ct in this.entities.ClientTemplate.Where(x => t.TemplateTypeId == ct.TemplateTypeId && ct.ClientId == 149).DefaultIfEmpty()
where t.TemplateTypeId == (from x in this.entities.QuoteType where x.QuoteTypeId == 7 select x.TemplateTypeId).FirstOrDefault()
orderby t.Version descending, ct.Version descending
select new { ct.Template == null ? t.Template : ct.Template }

答案 1 :(得分:0)

我认为这可能有用,虽然这是未经测试的,但从阅读开始,您似乎无法在LinQ语句中添加多个连接条件,因此您只需在where子句中指定它

所以在这里,我试着逐字转换SQL,所以这是我的尝试。如果它做了我认为它会做的一切,它将起作用。

int templateTypeId;
templateTypeId= (context.QuoteType.Where(x => x.QuoteTypeId == 7)).FirstOrDefault().TemplateTypeId

var qry =(

from t in context.Template
join ct in context.ClientTemplate on
t.TemplateTypeId equals ct.TemplateTypeId  into cts

from ct in cts.DefaultIfEmpty()  //left join

where t.TemplateTypeId == templateTypeId
        && ct.ClientId == 149   
 order by t.Version descending, ct.Version descending
select new 
{
  Template = (ct.Template != null) ? ct.Template : t.Template //ternary operator
}).FirstOrDefault();