如何在我的情况下使用类似于SQL的LINQ查询 [英] How to use LINQ similar to SQL in query for my case

查看:58
本文介绍了如何在我的情况下使用类似于SQL的LINQ查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 Reader 类包含

int ReaderId,字符串ReaderName,...............

然后我有 List<读者> 'readersList'包含Reader类的记录。



我用2列ReaderId和ReaderName创建 DataTable readersDataTable





我想从readersList获取那些记录,其中ReaderId不在readersDataTable中。 (在其他方面我想要从readersList中读取ReaderId的readersList中排除那些记录。)我想要LINQ函数similer到SQL IN查询我的情况。



大家好,我是



1)Class Defn

I have Reader Class containing
int ReaderId, string ReaderName, ……………
Then I have List<reader> 'readersList' containing records of Reader class.

I create DataTable readersDataTable with 2 columns ReaderId and ReaderName


I want to obtain those records from readersList where ReaderId not present in readersDataTable. (In other wants I want to exclude those records from readersList whose ReaderId present in readersDataTable.) I want LINQ functions similer to SQL IN query for my case.

Hi All, FYI

1) Class Defn

public class Reader
{
  int ReaderId;
  string ReaderName;
  // More members
}





2)



2)

List readersList = ReaderService.GetReadersOfSheduler(); // readersList contains Reader objects





3)



3)

DataTable readersDataTable = DataService.GetReadersFromId(this.Id).Tables[0]; 
// returns DataTable with 2 columns ReaderId and ReaderName of course with some records.





现在我想从readersList获取那些记录,其中ReaderId不存在于使用LINQ的readersDataTable中。



先谢谢。



我的尝试:



尝试了几种LINQ选项,但找不到合适的选项。



Now I want to obtain those records from readersList where ReaderId not present in readersDataTable using LINQ.

Thanks in advance.

What I have tried:

Tried several options of LINQ but cant find suitable one.

推荐答案

嗨Umesh,



试试这个



Hi Umesh,

Try this

List<reader> lstreader = new List<reader>()
{ new Reader { ReaderId=1,ReaderName="A"},
new Reader { ReaderId=2,ReaderName="B"},
new Reader { ReaderId=3,ReaderName="C"},
new Reader { ReaderId=4,ReaderName="D"}
};

DataTable dt = new DataTable();
dt.Columns.Add("ReaderId", typeof(int));
dt.Columns.Add("ReaderName", typeof(string));
dt.Rows.Add(5, "E");
dt.Rows.Add(6, "F");
dt.Rows.Add(2, "B");
dt.Rows.Add(3, "D");


var result = lstreader.Where(r => !dt.AsEnumerable()
                    .Select(t => t.Field<int>("ReaderId"))
                    .ToArray<int>()
                    .Contains(r.ReaderId))
                    .ToList<reader>();


如果您的列表大小超过非平凡值,请避免 O(n * m)算法。

这个只有 O(n + m)

(从jinesh的解决方案中借用值设置。)

If your lists are more than non-trivial in size, avoid O(n * m) algorithms.
This one is only O(n + m).
(Borrowing the value setup from jinesh's Solution.)
List<Reader> lstreader = new List<Reader>()
{ new Reader { ReaderId=1,ReaderName="A"},
new Reader { ReaderId=2,ReaderName="B"},
new Reader { ReaderId=3,ReaderName="C"},
new Reader { ReaderId=4,ReaderName="D"}
};
 
DataTable dt = new DataTable();
dt.Columns.Add("ReaderId", typeof(int));
dt.Columns.Add("ReaderName", typeof(string));
dt.Rows.Add(5, "E");
dt.Rows.Add(6, "F");
dt.Rows.Add(2, "B");
dt.Rows.Add(3, "D");

var result = lstreader.Except(dt.AsEnumerable().Select(t => t.Field<int>("ReaderId")));



编辑:MTH - 哎呀:想法不够, .Except()不是对于这种情况非常正确。

相反尝试(这仍然是 O(n + m)):


MTH -- Oops: Not enough thinking, .Except() isn't quite correct for this case.
Instead try (this still is O(n + m)):

var dtReaderIds = dt.AsEnumerable().Select(t => t.Field<int>("ReaderId"));
HashSet<int> excludedIds = new HashSet<int>(dtReaderIds);
IEnumerable<Reader> result = lstreader.Where(r => !excludedIds.Contains(r.ReaderId));


这篇关于如何在我的情况下使用类似于SQL的LINQ查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆