2017-06-03 48 views
0

我在.NET項目寫這樣的代碼:優化LINQ查詢,以避免重複枚舉

var v = ctx.Items 
     .Where(x => x.userid== user.userid) 
     .Select(e => new MyViewModel 
     { 
      Title = e.Title, 
      CurrentPrice = e.CurrenctPrice.Value, 
      ItemID = e.ItemID.ToString(), 
      Sales = e.Transactions.Where(p => p.TransactionDate >= intoPast && p.TransactionDate <= endDate).Sum(x => x.QuantityPurchased) 
     }) 
     .Where(x => x.Sales > 0 && ((filterWord == "") || (filterWord != "" && x.Title.ToLower().Contains(filterWord.ToLower())))); 

其中「CTX」是我對象上下文變量...

這是ViewModelClass,我使用:

public class MyViewModel 
    { 
     public string Title { get; set; } 
     public int Sales { get; set; } 
     public string ItemID { get; set; } 
     public double CurrentPrice { get; set; } 
    } 

的事情,大多數錯誤我這裏是銷售物業......正如你可以看到我在SELECT語句設置它的值。這樣,我所有的數據每次都被列舉出來......

我在這裏想的是創建一個名爲「getsales()」的方法...然後在我的where語句中調用GetSales方法:

.Where(x=>X.GetSales(/*neccesary parameters here*/)...) 

爲了避免多個枚舉...

但我真的不知道該怎麼辦呢?

有人可以幫助我在這裏?

+0

嘿@Nkosi你爲什麼要刪除回覆,我只是要讀吧XD – User987

+1

你能不能動的了'filter'部分查詢最初的'.Where'子句?此外,您不需要'filterWord!=「」'部分,因爲要執行的那部分代碼,'filterWord =='「''必須已經評估爲'false' –

+0

@RufusL您的意思是這樣的: .Where(x => x.Sales> 0 &&((filterWord ==「」)||(x.Title.ToLower()。Contains(filterWord.ToLower())))); ? P.S.我沒有得到第一部分,你能否以答覆的形式答覆,以便我能看到你的意見? – User987

回答

1

我認爲這是你在找什麼:

var v = ctx.Items 
    .Where(x => 
     x.userid == user.userid && 
     (filterWord == "" || x.Title.ToLower().Contains(filterWord.ToLower()))) 
    .Select(e => new MyViewModel 
    { 
     Title = e.Title, 
     CurrentPrice = e.CurrentPrice.Value, 
     ItemID = e.ItemID.ToString(), 
     Sales = e.Transactions 
      .Where(p => 
       p.TransactionDate >= intoPast && 
       p.TransactionDate <= endDate) 
      .Sum(x => x.QuantityPurchased) 
    }) 
    .Where(x => x.Sales > 0); 
+0

嘿魯弗斯,感謝您的答覆,它說在這裏修改where語句如下:信息:LINQ to實體不承認方法'Int32 IndexOf(System.String,System.StringComparison)'方法,並且此方法不能翻譯成商店表達。 – User987

+0

啊,真的!在這種情況下,'Contains'是要走的路。更新了答案 –