【问题标题】:Difference between LINQ Lambda and SQL statementLINQ Lambda 和 SQL 语句的区别
【发布时间】:2017-08-11 11:51:54
【问题描述】:

我有以下 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 查询遗漏了什么或做错了什么?

【问题讨论】:

  • 您的两个查询看起来一点也不相似 - SQL 查询中引用了CategoryFk 哪里?

标签: c# sql linq lambda


【解决方案1】:

我认为您必须从您的 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));
}

【讨论】:

    【解决方案2】:

    你应该从你的 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))
    

    它没有经过测试,所以第一次尝试可能无法正常工作。

    【讨论】:

      【解决方案3】:

      我会将 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 };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2018-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多