2017-06-22 148 views
-1

我有一個包含兩個字段,System.DateTime類型的日期和ID類型的SQL即成表int表與多個LINQ的選擇包含

我也有一個列表,它包含相同的結構或對象的集合數據,我期待,當我運行這個它拋出我錯過的"Unable to create a constant value of type 'RecordsTable'. Only primitive types or enumeration types are supported in this context."

一個例外,從數據庫中提取

var itemsToDelete = db.RecordsTable.Where(
    dbRecord => myList.Any(
     item => item.PhysicalID == dbRecord.PhysicalId && item.date.Equals(dbRecord.date) 
    ) 
); 

然而,比賽嗎?

+1

的[LINQ可能的複製到實體 - where..in條款與多列](https://stackoverflow.com/questions/6912733/linq-to-entities-where-in-clause-with-multiple-columns) –

+3

'myList'是一個本地列表,不能用於除非使用db.RecordsTable.AsEnumerable(),否則爲多個列生成一個SQL查詢,其中....'將所有數據提取到內存集中。 – user3185569

回答

0

您可以提取列表中的投影字段並應用在哪裏。

var physicalIds = myList.Select(x => x.PhysicalID).Distinct().ToList(); 
var dates = myList.Select(x => x.date).Distinct().ToList(); 
var itemsToDelete = db.RecordsTable.Where(dbRecord => physicalIds.Contains(dbRecord.PhysicalID) && dates.Contains(dbRecord.date)).ToList(); 

越來越內存記錄後,你可以申請加入與條件都投影領域,並篩選您的精確匹配:

itemsToDelete = (from itm in itemsToDelete 
       join lst in myList on new {itm.PhysicalID, itm.date} equals new {lst.PhysicalID, lst.date} 
       select new itm).ToList();