如何使用LINQ加入DataTable和SQL表

时间:2013-02-16 07:59:18

标签: vb.net linq

我需要使用LINQ加入DataTable和SQL表。

这是LINQ查询:

from c in db.Staging
join c1 in tagging on c.RPT_ID equals c1.RPT_ID
select c

但是我收到以下错误:

  

System.NotSupportedException:除了Contains运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现。

3 个答案:

答案 0 :(得分:0)

如果您加入的所有记录都先在内存中,则只能执行此操作。您需要执行以下操作。

var s = db.Staging.ToList(); 
var joinedResult = from c in s
                 join c1 in tagging on c.RPT_ID = c1.RPT_ID
                 select c;

调用ToList()会导致SQL执行并从数据库中获取所有记录。如果数据库中有大量记录,这并不好。

您可能想要做的是以下内容。

var IDs = tagging.Select(t=>t.RPT_ID).ToArray();
var matches = db.Staging.Where(s=>IDs.Contains(s.RPT_ID);

只能在数据库中找到数据表中具有ID的暂存记录。如果你有一个很大的临时表,效率会更高。

答案 1 :(得分:0)

试试这个:

from c in db.Staging
join c1 in tagging on c.RPT_ID = c1.RPT_ID
select c

我没有VS确认,但我认为它打破'等于',因为它是内置的.NET功能。 LINQ无法将所有函数转换为TSQL。

答案 2 :(得分:0)

db = new YourContext();
MyClass t = new MyClass ();
var listOfIEnumerableData = from myClass in t.GetMyClassData()
                            select new MyClass { ID = myClass.ID, Name=myClass.Name,Description=myClass.Description};

var v = (from t1 in db.DbClass.AsEnumerable()
         join t2 in listOfIEnumerableData on t1.DbClassFK equals t2.ID
         select new VmMyClass
             {
                 MyClass = t1,
                 DbClass = t2
             }).OrderByDescending(x => x.Acc_Chart1.ID).Take(100).AsEnumerable();

this.DataList = v;