繁体   English   中英

LINQ Lambda和SQL语句之间的区别

[英]Difference between LINQ Lambda and SQL statement

我有以下lambda语句:

var resources = Db.Resource.Where(w => w.ResValue.Any(a => a.ApplicationFk == applicationPk) && w.CategoryFk == (categoryId ?? w.CategoryFk ) && w.IsEditable);
if (cultureIdsMissing!= null)
{
     resources = resources.Where(w => w.ResValue.Any(a => cultureIdsMissing.Any(aa => aa == a.CultureFk) && a.Value == string.Empty));
 }

这不是返回我想要的结果,它由以下方式返回:

SELECT Resource.ResourcePk, Resource.CategoryFk, Resource.Name, Resource.IsEditable, ResValue.ApplicatieFk, ResValue.CultureFk, ResValue.Value
FROM Resource 
INNER JOIN ResValue ON Resource.ResourcePk = ResValue.ResourceFk
WHERE (ResValue.ApplicatieFk = 6) 
AND (Resource.IsEditable = 1) 
AND (ResValue.Value = '') 
AND (ResValue.CultureFk = 1 OR ResValue.CultureFk = 2)

并不是不是cultureIdsMissing是一个包含数字1和2的列表,我在lambda查询中缺少什么或做错了什么?

我认为您必须从linq lemda表达式中删除&& w.CategoryFk == (categoryId ?? w.CategoryFk ) 如果categoryId = 1则它将仅记录值为1记录。 因此,请尝试将其删除。 您的linq代码应该是这样。

var resources = Db.Resource.Where(w => w.ResValue.Any(a => a.ApplicationFk == applicationPk)&& w.IsEditable);
if (cultureIdsMissing!= null)
{
    resources = resources.Where(w => w.ResValue.Any(a => cultureIdsMissing.Any(aa => aa == a.CultureFk) && a.Value == string.Empty));
}

您应该从sql语句中获取它:

Db.Resource
.Join(Db.ResValue
, rs => rs.ResourcePk
, resV => resv.resourceFk
, (rs, resv) => new { res = rs, resV = resV })
.Where(w => w.resv.ApplicatieFk == 6
&& w.res ==1
&& resv.Value == string.empty()
&& (resv.CultureFk == 1 || resv.CultureFk == 2))

它没有经过测试,所以也许在第一次尝试时就不会起作用。

我将SQL转换为查询理解语法。 通常,以查询理解顺序转换短语,使用表别名作为范围变量(或创建范围变量),并将一元/整体聚合函数(例如TOPDISTINCTSUM )作为整个查询之外的函数调用。 对于您的SQL,

var ans = from r in Resource
          where r.IsEditable == 1
          join rv in ResValue on r.ResourcePk equals rv.ResourceFk
          where rv.ApplicatieFk == 6 && rv.Value == "" && (rv.CultureFk == 1 || rv.CultureFk == 2)
          select new { r.ResourcePk, r.CategoryFk, r.Name, r.IsEditable, rv.ApplicatieFk, rv.CultureFk, rv.Value };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM