如何编写一个方法来同时为SQL和数组构建查询?
我有一个动态生成查询的方法如何编写一个方法来同时为SQL和数组构建查询?,sql,linq,object,Sql,Linq,Object,我有一个动态生成查询的方法BuildQuery。它适用于SQL: static MyType[] GetDataFromDB(MyDataContext db, string city, string district, string region, string country, string zip) { var q = BuildQuery(db.MyTable.AsQueryable(), city, district, region, country,
BuildQuery
。它适用于SQL:
static MyType[] GetDataFromDB(MyDataContext db, string city, string district, string region, string country, string zip)
{
var q = BuildQuery(db.MyTable.AsQueryable(), city, district, region, country, zip);
return q.ToArray();
}
private static IQueryable<MyType> BuildQuery(IQueryable<MyType> q, string city, string district, string region, string country, string zip)
{
if (!string.IsNullOrEmpty(city))
q = q.Where(p => p.City.Contains(city));
if (!string.IsNullOrEmpty(district))
q = q.Where(p => p.District.Contains(district));
if (!string.IsNullOrEmpty(zip))
q = q.Where(p => p.Zip == zip);
if (!string.IsNullOrEmpty(region))
q = q.Where(p => p.Region.Contains(region));
if (!string.IsNullOrEmpty(country))
q = q.Where(p => p.Country == country);
return q;
}
当然,这不会编译,因为MyType[]
是IEnumerable
,而不是IQueryable
。将BuildQuery
中第一个参数的类型更改为IEnumerable
,编译数组并可用于数组,但不会生成SQL查询
我想我可以让BuildQuery成为一个通用的方法,但是怎么做呢?有什么好主意吗?LINQ的一个优点是,您可以将函数相互连接(链接)。这是可能的,因为引入了扩展方法 如果稍微更改BuildQuery函数,可以将其用作任何LINQ函数。看 好吧,也许你应该给它取个恰当的名字:要不要查询一下 要执行查询,请执行您想对其执行的操作:
ToList
/ToArray
/Count/FirstOrDefault/
顺便说一下,在创建类似LINQ的函数时,通常最好返回IEnumerable/IQueryable,而不是List/Array/etc,除非您确实知道调用者需要完整的序列。如果你调用
ToList()
,而你的调用者只想要FirstOrDefault()
如果你用传入你的数组,那将是一种浪费。AsQueryable()
可以吗?
MyType[] SelectFromResult(MyType[] loc, string city, string district, string region, string country, string zip)
{
var q = BuildQuery(loc, city, district, region, country, zip);
return q.ToArray();
}
private static IQueryable<MyType> BuildQuery(this IQueryable<MyType> q,
string city, string district, string region, string country, string zip)
{
...
MyType[] loc = ...
IQueryable<MyType> myQueryable = loc.AsQueryable()
.BuildQuery(city, district, ....);