C#可以编写一个方法对T表查询并返回List<T>吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#可以编写一个方法对T表查询并返回List<T>吗相关的知识,希望对你有一定的参考价值。

用的是 linq to entities 。
如何编写这样的一个方法:
public List<T> GetXXXXX<T>(???);
返回的结果是我给定的T类型
如果我表里面有10个表,我只需要用一个这个方法就查询这10个表,能实现不?
???的内容也许可以是:Func<T,bool> func吧?但是方法要怎么写?

参考技术A 我不知道你说的是不是我现在所做的,感觉有点相似,我没太明白你所说的内容,我想把我做的描述下。
我定义了一个public class MDB<T,K>这样的类,目的是通过此类中的方法实现对内存数据增删查改,如果发现内存中没有我要的数据,将会到数据库中查找,我的库里大概有20个表,所有的操作都是通过这个类里的方法统一完成的(也就是说我用同一个方法完成了所有表相同的操作)
这个类的内容中有类似如下方法的很多方法
1)public MDBData<T> GetTable(K key, DataInitializer<K> GetData, TableFormer dataFormer, out string msg)
其中
DataInitializer<K> GetData 是一个委托的实例,用来在初始化是去数据库中取出不同的数据
TableFormer dataFormer 这也是一个委托的实例,用来把数据库中的数据装到List<T>中
2)这只是个例子,用来查找数据,你可以在这个类里写删除 和修改的方法,然后把具体的操作通过委托传进来追问

饿,我没看懂啊,能说简单点吗?比如我有一个Product表和一个Customer表,能否只用一个方法
比如说
public List Query(Expression> where)
这样的方法,然后我调用的时候就:
List p = Query(expr) 或者
List p = Query(expr)
就可以取得Product表和Customer表的内容。

追答

就我对“linq 到对象”的了解,想通过传lambda表达式来完成你的想法是不行的。因为所有linq到对象的方法都是扩展方法,这些方法的施用对象是已经存在于内存中的集合,如果你在内存中已经存在某种集合你可以通过linq到对象来对此集合(已实现IEnumerable)进行操作,但是如果你想通过传递lambda来从数据库捞取数据恐怕要用到linq to sql,很惭愧我对linq to sql 也不熟悉。
如果你把参数定义成委托的话应该也可以实现,当你实例化的时候不是传递一个lambda,而是一个告诉Query如何从数据库读取数据的方法,方法里面要实现具体的数据库连接等操作,那不就实现了吗

本回答被提问者采纳
参考技术B 尝试过了,没有成功,不太容易。
假设你有一张表:Person,那么用EntityFramework的情况下,只要用:
entities.Person.ToList<Person>();不就可以了,这个本身就是泛型方法啊。追问

那我要where呢,怎么办?而且主要是添加修改删除记录方面,我想3个方法直接能通用添加、修改、删除所有的表……
其实还是3层架构的问题,我想尝试分层来做,于是就…………

追答

EntityFramework或者Linq都不需要再分层了,他们本身就已经分层了:业务层+数据访问层

参考技术C (from t1 in Table1
select t1)
.Concat(
from t2 in Table2
select t2
).Concat
依此类推

当然你也可以用Expression Tree自己做查询,具体你要看msdn了

请教C#中的List<T>,筛选list中特定元素的方法

//Account是账号表类,Trade是交易表类,各表的属性已封装好了
Dictionary<string,Account> accounts=new Dictionary<string,Account>();
List<Trade> trades=new List<Trade>();

public string Take(string code, double money, string memo)

if (!accounts.ContainsKey(code))
return "该账号不存在!";

double balance = accounts[code].Balance - money;
if (balance < 0)
return "取款余额不足!";

accounts[code].Balance -= money;

Trade trade = new Trade();
trade.Code = code;
trade.Money = money;
trade.Date = DateTime.Now;
trade.Memo = memo;
trade.Thistype = TransType.Take;
trades.Add(trade);

return "取款成功!";


我现在是想从这个List对象trades中筛选出多个trade元素,这些trade元素的Code字段全都是"0001",我该用什么方法删除掉?请各位高手指教
这位fnsword朋友,你用trades对象调用FindAll()方法,怎么在方法参数里传递了一个方法的定义啊?看不懂。。。晕

参考技术A 简单的掉渣:
List<Trade> newtrades = trades.FindAll(delegate(Trade p) return p.Code == "0001"; );

要充分利用.net的优势,复杂问题简洁化,简洁不简单……

问题补充:先汗一下,这是匿名函数本回答被提问者采纳
参考技术B 循环查找
删除用
Remove()

RemoveAt()

以上是关于C#可以编写一个方法对T表查询并返回List<T>吗的主要内容,如果未能解决你的问题,请参考以下文章

从 List<OwnStruct> 返回 List<T> 的方法,其中 List<T> 仅包含 List 中所有 OwnStructs 的一个属性(C#)[重复]

linq多表查询怎么用List<T>返回?

从查询 C#、EF Core 返回一个值

C#怎样定义返回值为List的方法

LinQ多表查询返回单张表的List<>结果集,但是页面要求用DataTable类型的接收这个结果集 如何将这个list转成

请教C#中的List<T>,筛选list中特定元素的方法