簡體   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